Skip to content

Instantly share code, notes, and snippets.

@billfitzgerald
Last active July 30, 2020 15:56
Show Gist options
  • Select an option

  • Save billfitzgerald/236473861403af982f6f1558687dd292 to your computer and use it in GitHub Desktop.

Select an option

Save billfitzgerald/236473861403af982f6f1558687dd292 to your computer and use it in GitHub Desktop.
Javascript loaded from College Board web site 09 July 2020, referenced in this story: https://medium.com/cr-digital-lab/student-tracking-and-the-college-board-512a94d60ec3
/**
* @license
* Adobe Visitor API for JavaScript version: 4.6.0
* Copyright 2020 Adobe, Inc. All Rights Reserved
* More info available at https://marketing.adobe.com/resources/help/en_US/mcvid/
*/
var e=function(){"use strict";function e(t){"@babel/helpers - typeof";return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(t)}function t(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function n(){return{callbacks:{},add:function(e,t){this.callbacks[e]=this.callbacks[e]||[];var n=this.callbacks[e].push(t)-1,i=this;return function(){i.callbacks[e].splice(n,1)}},execute:function(e,t){if(this.callbacks[e]){t=void 0===t?[]:t,t=t instanceof Array?t:[t];try{for(;this.callbacks[e].length;){var n=this.callbacks[e].shift();"function"==typeof n?n.apply(null,t):n instanceof Array&&n[1].apply(n[0],t)}delete this.callbacks[e]}catch(e){}}},executeAll:function(e,t){(t||e&&!j.isObjectEmpty(e))&&Object.keys(this.callbacks).forEach(function(t){var n=void 0!==e[t]?e[t]:"";this.execute(t,n)},this)},hasCallbacks:function(){return Boolean(Object.keys(this.callbacks).length)}}}function i(e,t,n){var i=null==e?void 0:e[t];return void 0===i?n:i}function r(e){for(var t=/^\d+$/,n=0,i=e.length;n<i;n++)if(!t.test(e[n]))return!1;return!0}function a(e,t){for(;e.length<t.length;)e.push("0");for(;t.length<e.length;)t.push("0")}function o(e,t){for(var n=0;n<e.length;n++){var i=parseInt(e[n],10),r=parseInt(t[n],10);if(i>r)return 1;if(r>i)return-1}return 0}function s(e,t){if(e===t)return 0;var n=e.toString().split("."),i=t.toString().split(".");return r(n.concat(i))?(a(n,i),o(n,i)):NaN}function l(e){return e===Object(e)&&0===Object.keys(e).length}function c(e){return"function"==typeof e||e instanceof Array&&e.length}function u(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:function(){return!0};this.log=_e("log",e,t),this.warn=_e("warn",e,t),this.error=_e("error",e,t)}function d(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.isEnabled,n=e.cookieName,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=i.cookies;return t&&n&&r?{remove:function(){r.remove(n)},get:function(){var e=r.get(n),t={};try{t=JSON.parse(e)}catch(e){t={}}return t},set:function(e,t){t=t||{},r.set(n,JSON.stringify(e),{domain:t.optInCookieDomain||"",cookieLifetime:t.optInStorageExpiry||3419e4,expires:!0})}}:{get:Pe,set:Pe,remove:Pe}}function f(e){this.name=this.constructor.name,this.message=e,"function"==typeof Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error(e).stack}function p(){function e(e,t){var n=De(e);return n.length?n.every(function(e){return!!t[e]}):Se(t)}function t(){M(b),O(ce.COMPLETE),_(h.status,h.permissions),m.set(h.permissions,{optInCookieDomain:l,optInStorageExpiry:c}),C.execute(xe)}function n(e){return function(n,i){if(!Ae(n))throw new Error("[OptIn] Invalid category(-ies). Please use the `OptIn.Categories` enum.");return O(ce.CHANGED),Object.assign(b,ye(De(n),e)),i||t(),h}}var i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=i.doesOptInApply,a=i.previousPermissions,o=i.preOptInApprovals,s=i.isOptInStorageEnabled,l=i.optInCookieDomain,c=i.optInStorageExpiry,u=i.isIabContext,f=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},p=f.cookies,g=Le(a);Re(g,"Invalid `previousPermissions`!"),Re(o,"Invalid `preOptInApprovals`!");var m=d({isEnabled:!!s,cookieName:"adobeujs-optin"},{cookies:p}),h=this,_=le(h),C=ge(),I=Me(g),v=Me(o),D=m.get(),S={},A=function(e,t){return ke(e)||t&&ke(t)?ce.COMPLETE:ce.PENDING}(I,D),y=function(e,t,n){var i=ye(pe,!r);return r?Object.assign({},i,e,t,n):i}(v,I,D),b=be(y),O=function(e){return A=e},M=function(e){return y=e};h.deny=n(!1),h.approve=n(!0),h.denyAll=h.deny.bind(h,pe),h.approveAll=h.approve.bind(h,pe),h.isApproved=function(t){return e(t,h.permissions)},h.isPreApproved=function(t){return e(t,v)},h.fetchPermissions=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=t?h.on(ce.COMPLETE,e):Pe;return!r||r&&h.isComplete||!!o?e(h.permissions):t||C.add(xe,function(){return e(h.permissions)}),n},h.complete=function(){h.status===ce.CHANGED&&t()},h.registerPlugin=function(e){if(!e||!e.name||"function"!=typeof e.onRegister)throw new Error(je);S[e.name]||(S[e.name]=e,e.onRegister.call(e,h))},h.execute=Ne(S),Object.defineProperties(h,{permissions:{get:function(){return y}},status:{get:function(){return A}},Categories:{get:function(){return ue}},doesOptInApply:{get:function(){return!!r}},isPending:{get:function(){return h.status===ce.PENDING}},isComplete:{get:function(){return h.status===ce.COMPLETE}},__plugins:{get:function(){return Object.keys(S)}},isIabContext:{get:function(){return u}}})}function g(e,t){function n(){r=null,e.call(e,new f("The call took longer than you wanted!"))}function i(){r&&(clearTimeout(r),e.apply(e,arguments))}if(void 0===t)return e;var r=setTimeout(n,t);return i}function m(){if(window.__cmp)return window.__cmp;var e=window;if(e===window.top)return void Ie.error("__cmp not found");for(var t;!t;){e=e.parent;try{e.frames.__cmpLocator&&(t=e)}catch(e){}if(e===window.top)break}if(!t)return void Ie.error("__cmp not found");var n={};return window.__cmp=function(e,i,r){var a=Math.random()+"",o={__cmpCall:{command:e,parameter:i,callId:a}};n[a]=r,t.postMessage(o,"*")},window.addEventListener("message",function(e){var t=e.data;if("string"==typeof t)try{t=JSON.parse(e.data)}catch(e){}if(t.__cmpReturn){var i=t.__cmpReturn;n[i.callId]&&(n[i.callId](i.returnValue,i.success),delete n[i.callId])}},!1),window.__cmp}function h(){var e=this;e.name="iabPlugin",e.version="0.0.1";var t=ge(),n={allConsentData:null},i=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return n[e]=t};e.fetchConsentData=function(e){var t=e.callback,n=e.timeout,i=g(t,n);r({callback:i})},e.isApproved=function(e){var t=e.callback,i=e.category,a=e.timeout;if(n.allConsentData)return t(null,s(i,n.allConsentData.vendorConsents,n.allConsentData.purposeConsents));var o=g(function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=n.vendorConsents,a=n.purposeConsents;t(e,s(i,r,a))},a);r({category:i,callback:o})},e.onRegister=function(t){var n=Object.keys(de),i=function(e){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=i.purposeConsents,a=i.gdprApplies,o=i.vendorConsents;!e&&a&&o&&r&&(n.forEach(function(e){var n=s(e,o,r);t[n?"approve":"deny"](e,!0)}),t.complete())};e.fetchConsentData({callback:i})};var r=function(e){var r=e.callback;if(n.allConsentData)return r(null,n.allConsentData);t.add("FETCH_CONSENT_DATA",r);var s={};o(function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=e.purposeConsents,o=e.gdprApplies,l=e.vendorConsents;(arguments.length>1?arguments[1]:void 0)&&(s={purposeConsents:r,gdprApplies:o,vendorConsents:l},i("allConsentData",s)),a(function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};(arguments.length>1?arguments[1]:void 0)&&(s.consentString=e.consentData,i("allConsentData",s)),t.execute("FETCH_CONSENT_DATA",[null,n.allConsentData])})})},a=function(e){var t=m();t&&t("getConsentData",null,e)},o=function(e){var t=Fe(de),n=m();n&&n("getVendorConsents",t,e)},s=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},i=!!t[de[e]];return i&&function(){return fe[e].every(function(e){return n[e]})}()}}var _="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};Object.assign=Object.assign||function(e){for(var t,n,i=1;i<arguments.length;++i){n=arguments[i];for(t in n)Object.prototype.hasOwnProperty.call(n,t)&&(e[t]=n[t])}return e};var C,I,v={HANDSHAKE:"HANDSHAKE",GETSTATE:"GETSTATE",PARENTSTATE:"PARENTSTATE"},D={MCMID:"MCMID",MCAID:"MCAID",MCAAMB:"MCAAMB",MCAAMLH:"MCAAMLH",MCOPTOUT:"MCOPTOUT",CUSTOMERIDS:"CUSTOMERIDS"},S={MCMID:"getMarketingCloudVisitorID",MCAID:"getAnalyticsVisitorID",MCAAMB:"getAudienceManagerBlob",MCAAMLH:"getAudienceManagerLocationHint",MCOPTOUT:"isOptedOut",ALLFIELDS:"getVisitorValues"},A={CUSTOMERIDS:"getCustomerIDs"},y={MCMID:"getMarketingCloudVisitorID",MCAAMB:"getAudienceManagerBlob",MCAAMLH:"getAudienceManagerLocationHint",MCOPTOUT:"isOptedOut",MCAID:"getAnalyticsVisitorID",CUSTOMERIDS:"getCustomerIDs",ALLFIELDS:"getVisitorValues"},b={MC:"MCMID",A:"MCAID",AAM:"MCAAMB"},O={MCMID:"MCMID",MCOPTOUT:"MCOPTOUT",MCAID:"MCAID",MCAAMLH:"MCAAMLH",MCAAMB:"MCAAMB"},M={UNKNOWN:0,AUTHENTICATED:1,LOGGED_OUT:2},k={GLOBAL:"global"},E={MESSAGES:v,STATE_KEYS_MAP:D,ASYNC_API_MAP:S,SYNC_API_MAP:A,ALL_APIS:y,FIELDGROUP_TO_FIELD:b,FIELDS:O,AUTH_STATE:M,OPT_OUT:k},T=E.STATE_KEYS_MAP,P=function(e){function t(){}function n(t,n){var i=this;return function(){var r=e(0,t),a={};return a[t]=r,i.setStateAndPublish(a),n(r),r}}this.getMarketingCloudVisitorID=function(e){e=e||t;var i=this.findField(T.MCMID,e),r=n.call(this,T.MCMID,e);return void 0!==i?i:r()},this.getVisitorValues=function(e){this.getMarketingCloudVisitorID(function(t){e({MCMID:t})})}},L=E.MESSAGES,R=E.ASYNC_API_MAP,w=E.SYNC_API_MAP,F=function(){function e(){}function t(e,t){var n=this;return function(){return n.callbackRegistry.add(e,t),n.messageParent(L.GETSTATE),""}}function n(n){this[R[n]]=function(i){i=i||e;var r=this.findField(n,i),a=t.call(this,n,i);return void 0!==r?r:a()}}function i(t){this[w[t]]=function(){return this.findField(t,e)||{}}}Object.keys(R).forEach(n,this),Object.keys(w).forEach(i,this)},N=E.ASYNC_API_MAP,x=function(){Object.keys(N).forEach(function(e){this[N[e]]=function(t){this.callbackRegistry.add(e,t)}},this)},j=function(e,t){return t={exports:{}},e(t,t.exports),t.exports}(function(t,n){n.isObjectEmpty=function(e){return e===Object(e)&&0===Object.keys(e).length},n.isValueEmpty=function(e){return""===e||n.isObjectEmpty(e)};var i=function(){var e=navigator.appName,t=navigator.userAgent;return"Microsoft Internet Explorer"===e||t.indexOf("MSIE ")>=0||t.indexOf("Trident/")>=0&&t.indexOf("Windows NT 6")>=0};n.getIeVersion=function(){return document.documentMode?document.documentMode:i()?7:null},n.encodeAndBuildRequest=function(e,t){return e.map(encodeURIComponent).join(t)},n.isObject=function(t){return null!==t&&"object"===e(t)&&!1===Array.isArray(t)},n.defineGlobalNamespace=function(){return window.adobe=n.isObject(window.adobe)?window.adobe:{},window.adobe},n.pluck=function(e,t){return t.reduce(function(t,n){return e[n]&&(t[n]=e[n]),t},Object.create(null))},n.parseOptOut=function(e,t,n){t||(t=n,e.d_optout&&e.d_optout instanceof Array&&(t=e.d_optout.join(",")));var i=parseInt(e.d_ottl,10);return isNaN(i)&&(i=7200),{optOut:t,d_ottl:i}},n.normalizeBoolean=function(e){var t=e;return"true"===e?t=!0:"false"===e&&(t=!1),t}}),V=(j.isObjectEmpty,j.isValueEmpty,j.getIeVersion,j.encodeAndBuildRequest,j.isObject,j.defineGlobalNamespace,j.pluck,j.parseOptOut,j.normalizeBoolean,n),U=E.MESSAGES,H={0:"prefix",1:"orgID",2:"state"},B=function(e,t){this.parse=function(e){try{var t={};return e.data.split("|").forEach(function(e,n){if(void 0!==e){t[H[n]]=2!==n?e:JSON.parse(e)}}),t}catch(e){}},this.isInvalid=function(n){var i=this.parse(n);if(!i||Object.keys(i).length<2)return!0;var r=e!==i.orgID,a=!t||n.origin!==t,o=-1===Object.keys(U).indexOf(i.prefix);return r||a||o},this.send=function(n,i,r){var a=i+"|"+e;r&&r===Object(r)&&(a+="|"+JSON.stringify(r));try{n.postMessage(a,t)}catch(e){}}},G=E.MESSAGES,Y=function(e,t,n,i){function r(e){Object.assign(p,e)}function a(e){Object.assign(p.state,e),Object.assign(p.state.ALLFIELDS,e),p.callbackRegistry.executeAll(p.state)}function o(e){if(!h.isInvalid(e)){m=!1;var t=h.parse(e);p.setStateAndPublish(t.state)}}function s(e){!m&&g&&(m=!0,h.send(i,e))}function l(){r(new P(n._generateID)),p.getMarketingCloudVisitorID(),p.callbackRegistry.executeAll(p.state,!0),_.removeEventListener("message",c)}function c(e){if(!h.isInvalid(e)){var t=h.parse(e);m=!1,_.clearTimeout(p._handshakeTimeout),_.removeEventListener("message",c),r(new F(p)),_.addEventListener("message",o),p.setStateAndPublish(t.state),p.callbackRegistry.hasCallbacks()&&s(G.GETSTATE)}}function u(){g&&postMessage?(_.addEventListener("message",c),s(G.HANDSHAKE),p._handshakeTimeout=setTimeout(l,250)):l()}function d(){_.s_c_in||(_.s_c_il=[],_.s_c_in=0),p._c="Visitor",p._il=_.s_c_il,p._in=_.s_c_in,p._il[p._in]=p,_.s_c_in++}function f(){function e(e){0!==e.indexOf("_")&&"function"==typeof n[e]&&(p[e]=function(){})}Object.keys(n).forEach(e),p.getSupplementalDataID=n.getSupplementalDataID,p.isAllowed=function(){return!0}}var p=this,g=t.whitelistParentDomain;p.state={ALLFIELDS:{}},p.version=n.version,p.marketingCloudOrgID=e,p.cookieDomain=n.cookieDomain||"",p._instanceType="child";var m=!1,h=new B(e,g);p.callbackRegistry=V(),p.init=function(){d(),f(),r(new x(p)),u()},p.findField=function(e,t){if(void 0!==p.state[e])return t(p.state[e]),p.state[e]},p.messageParent=s,p.setStateAndPublish=a},q=E.MESSAGES,X=E.ALL_APIS,W=E.ASYNC_API_MAP,J=E.FIELDGROUP_TO_FIELD,K=function(e,t){function n(){var t={};return Object.keys(X).forEach(function(n){var i=X[n],r=e[i]();j.isValueEmpty(r)||(t[n]=r)}),t}function i(){var t=[];return e._loading&&Object.keys(e._loading).forEach(function(n){if(e._loading[n]){var i=J[n];t.push(i)}}),t.length?t:null}function r(t){return function n(r){var a=i();if(a){var o=W[a[0]];e[o](n,!0)}else t()}}function a(e,i){var r=n();t.send(e,i,r)}function o(e){l(e),a(e,q.HANDSHAKE)}function s(e){r(function(){a(e,q.PARENTSTATE)})()}function l(n){function i(i){r.call(e,i),t.send(n,q.PARENTSTATE,{CUSTOMERIDS:e.getCustomerIDs()})}var r=e.setCustomerIDs;e.setCustomerIDs=i}return function(e){if(!t.isInvalid(e)){(t.parse(e).prefix===q.HANDSHAKE?o:s)(e.source)}}},z=function(e,t){function n(e){return function(n){i[e]=n,r++,r===a&&t(i)}}var i={},r=0,a=Object.keys(e).length;Object.keys(e).forEach(function(t){var i=e[t];if(i.fn){var r=i.args||[];r.unshift(n(t)),i.fn.apply(i.context||null,r)}})},Q={get:function(e){e=encodeURIComponent(e);var t=(";"+document.cookie).split(" ").join(";"),n=t.indexOf(";"+e+"="),i=n<0?n:t.indexOf(";",n+1);return n<0?"":decodeURIComponent(t.substring(n+2+e.length,i<0?t.length:i))},set:function(e,t,n){var r=i(n,"cookieLifetime"),a=i(n,"expires"),o=i(n,"domain"),s=i(n,"secure"),l=s?"Secure":"";if(a&&"SESSION"!==r&&"NONE"!==r){var c=""!==t?parseInt(r||0,10):-60;if(c)a=new Date,a.setTime(a.getTime()+1e3*c);else if(1===a){a=new Date;var u=a.getYear();a.setYear(u+2+(u<1900?1900:0))}}else a=0;return e&&"NONE"!==r?(document.cookie=encodeURIComponent(e)+"="+encodeURIComponent(t)+"; path=/;"+(a?" expires="+a.toGMTString()+";":"")+(o?" domain="+o+";":"")+l,this.get(e)===t):0},remove:function(e,t){var n=i(t,"domain");n=n?" domain="+n+";":"",document.cookie=encodeURIComponent(e)+"=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;"+n}},$=function(e){var t;!e&&_.location&&(e=_.location.hostname),t=e;var n,i=t.split(".");for(n=i.length-2;n>=0;n--)if(t=i.slice(n).join("."),Q.set("test","cookie",{domain:t}))return Q.remove("test",{domain:t}),t;return""},Z={compare:s,isLessThan:function(e,t){return s(e,t)<0},areVersionsDifferent:function(e,t){return 0!==s(e,t)},isGreaterThan:function(e,t){return s(e,t)>0},isEqual:function(e,t){return 0===s(e,t)}},ee=!!_.postMessage,te={postMessage:function(e,t,n){var i=1;t&&(ee?n.postMessage(e,t.replace(/([^:]+:\/\/[^\/]+).*/,"$1")):t&&(n.location=t.replace(/#.*$/,"")+"#"+ +new Date+i+++"&"+e))},receiveMessage:function(e,t){var n;try{ee&&(e&&(n=function(n){if("string"==typeof t&&n.origin!==t||"[object Function]"===Object.prototype.toString.call(t)&&!1===t(n.origin))return!1;e(n)}),_.addEventListener?_[e?"addEventListener":"removeEventListener"]("message",n):_[e?"attachEvent":"detachEvent"]("onmessage",n))}catch(e){}}},ne=function(e){var t,n,i="0123456789",r="",a="",o=8,s=10,l=10;if(1==e){for(i+="ABCDEF",t=0;16>t;t++)n=Math.floor(Math.random()*o),r+=i.substring(n,n+1),n=Math.floor(Math.random()*o),a+=i.substring(n,n+1),o=16;return r+"-"+a}for(t=0;19>t;t++)n=Math.floor(Math.random()*s),r+=i.substring(n,n+1),0===t&&9==n?s=3:(1==t||2==t)&&10!=s&&2>n?s=10:2<t&&(s=10),n=Math.floor(Math.random()*l),a+=i.substring(n,n+1),0===t&&9==n?l=3:(1==t||2==t)&&10!=l&&2>n?l=10:2<t&&(l=10);return r+a},ie=function(e,t){return{corsMetadata:function(){var e="none",t=!0;return"undefined"!=typeof XMLHttpRequest&&XMLHttpRequest===Object(XMLHttpRequest)&&("withCredentials"in new XMLHttpRequest?e="XMLHttpRequest":"undefined"!=typeof XDomainRequest&&XDomainRequest===Object(XDomainRequest)&&(t=!1),Object.prototype.toString.call(_.HTMLElement).indexOf("Constructor")>0&&(t=!1)),{corsType:e,corsCookiesEnabled:t}}(),getCORSInstance:function(){return"none"===this.corsMetadata.corsType?null:new _[this.corsMetadata.corsType]},fireCORS:function(t,n,i){function r(e){var n;try{if((n=JSON.parse(e))!==Object(n))return void a.handleCORSError(t,null,"Response is not JSON")}catch(e){return void a.handleCORSError(t,e,"Error parsing response as JSON")}try{for(var i=t.callback,r=_,o=0;o<i.length;o++)r=r[i[o]];r(n)}catch(e){a.handleCORSError(t,e,"Error forming callback function")}}var a=this;n&&(t.loadErrorHandler=n);try{var o=this.getCORSInstance();o.open("get",t.corsUrl+"&ts="+(new Date).getTime(),!0),"XMLHttpRequest"===this.corsMetadata.corsType&&(o.withCredentials=!0,o.timeout=e.loadTimeout,o.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),o.onreadystatechange=function(){4===this.readyState&&200===this.status&&r(this.responseText)}),o.onerror=function(e){a.handleCORSError(t,e,"onerror")},o.ontimeout=function(e){a.handleCORSError(t,e,"ontimeout")},o.send(),e._log.requests.push(t.corsUrl)}catch(e){this.handleCORSError(t,e,"try-catch")}},handleCORSError:function(t,n,i){e.CORSErrors.push({corsData:t,error:n,description:i}),t.loadErrorHandler&&("ontimeout"===i?t.loadErrorHandler(!0):t.loadErrorHandler(!1))}}},re={POST_MESSAGE_ENABLED:!!_.postMessage,DAYS_BETWEEN_SYNC_ID_CALLS:1,MILLIS_PER_DAY:864e5,ADOBE_MC:"adobe_mc",ADOBE_MC_SDID:"adobe_mc_sdid",VALID_VISITOR_ID_REGEX:/^[0-9a-fA-F\-]+$/,ADOBE_MC_TTL_IN_MIN:5,VERSION_REGEX:/vVersion\|((\d+\.)?(\d+\.)?(\*|\d+))(?=$|\|)/,FIRST_PARTY_SERVER_COOKIE:"s_ecid"},ae=function(e,t){var n=_.document;return{THROTTLE_START:3e4,MAX_SYNCS_LENGTH:649,throttleTimerSet:!1,id:null,onPagePixels:[],iframeHost:null,getIframeHost:function(e){if("string"==typeof e){var t=e.split("/");return t[0]+"//"+t[2]}},subdomain:null,url:null,getUrl:function(){var t,i="http://fast.",r="?d_nsid="+e.idSyncContainerID+"#"+encodeURIComponent(n.location.origin);return this.subdomain||(this.subdomain="nosubdomainreturned"),e.loadSSL&&(i=e.idSyncSSLUseAkamai?"https://fast.":"https://"),t=i+this.subdomain+".demdex.net/dest5.html"+r,this.iframeHost=this.getIframeHost(t),this.id="destination_publishing_iframe_"+this.subdomain+"_"+e.idSyncContainerID,t},checkDPIframeSrc:function(){var t="?d_nsid="+e.idSyncContainerID+"#"+encodeURIComponent(n.location.href);"string"==typeof e.dpIframeSrc&&e.dpIframeSrc.length&&(this.id="destination_publishing_iframe_"+(e._subdomain||this.subdomain||(new Date).getTime())+"_"+e.idSyncContainerID,this.iframeHost=this.getIframeHost(e.dpIframeSrc),this.url=e.dpIframeSrc+t)},idCallNotProcesssed:null,doAttachIframe:!1,startedAttachingIframe:!1,iframeHasLoaded:null,iframeIdChanged:null,newIframeCreated:null,originalIframeHasLoadedAlready:null,iframeLoadedCallbacks:[],regionChanged:!1,timesRegionChanged:0,sendingMessages:!1,messages:[],messagesPosted:[],messagesReceived:[],messageSendingInterval:re.POST_MESSAGE_ENABLED?null:100,onPageDestinationsFired:[],jsonForComparison:[],jsonDuplicates:[],jsonWaiting:[],jsonProcessed:[],canSetThirdPartyCookies:!0,receivedThirdPartyCookiesNotification:!1,readyToAttachIframePreliminary:function(){return!(e.idSyncDisableSyncs||e.disableIdSyncs||e.idSyncDisable3rdPartySyncing||e.disableThirdPartyCookies||e.disableThirdPartyCalls)},readyToAttachIframe:function(){return this.readyToAttachIframePreliminary()&&(this.doAttachIframe||e._doAttachIframe)&&(this.subdomain&&"nosubdomainreturned"!==this.subdomain||e._subdomain)&&this.url&&!this.startedAttachingIframe},attachIframe:function(){function e(){r=n.createElement("iframe"),r.sandbox="allow-scripts allow-same-origin",r.title="Adobe ID Syncing iFrame",r.id=i.id,r.name=i.id+"_name",r.style.cssText="display: none; width: 0; height: 0;",r.src=i.url,i.newIframeCreated=!0,t(),n.body.appendChild(r)}function t(e){r.addEventListener("load",function(){r.className="aamIframeLoaded",i.iframeHasLoaded=!0,i.fireIframeLoadedCallbacks(e),i.requestToProcess()})}this.startedAttachingIframe=!0;var i=this,r=n.getElementById(this.id);r?"IFRAME"!==r.nodeName?(this.id+="_2",this.iframeIdChanged=!0,e()):(this.newIframeCreated=!1,"aamIframeLoaded"!==r.className?(this.originalIframeHasLoadedAlready=!1,t("The destination publishing iframe already exists from a different library, but hadn't loaded yet.")):(this.originalIframeHasLoadedAlready=!0,this.iframeHasLoaded=!0,this.iframe=r,this.fireIframeLoadedCallbacks("The destination publishing iframe already exists from a different library, and had loaded alresady."),this.requestToProcess())):e(),this.iframe=r},fireIframeLoadedCallbacks:function(e){this.iframeLoadedCallbacks.forEach(function(t){"function"==typeof t&&t({message:e||"The destination publishing iframe was attached and loaded successfully."})}),this.iframeLoadedCallbacks=[]},requestToProcess:function(t){function n(){r.jsonForComparison.push(t),r.jsonWaiting.push(t),r.processSyncOnPage(t)}var i,r=this;if(t===Object(t)&&t.ibs)if(i=JSON.stringify(t.ibs||[]),this.jsonForComparison.length){var a,o,s,l=!1;for(a=0,o=this.jsonForComparison.length;a<o;a++)if(s=this.jsonForComparison[a],i===JSON.stringify(s.ibs||[])){l=!0;break}l?this.jsonDuplicates.push(t):n()}else n();if((this.receivedThirdPartyCookiesNotification||!re.POST_MESSAGE_ENABLED||this.iframeHasLoaded)&&this.jsonWaiting.length){var c=this.jsonWaiting.shift();this.process(c),this.requestToProcess()}e.idSyncDisableSyncs||e.disableIdSyncs||!this.iframeHasLoaded||!this.messages.length||this.sendingMessages||(this.throttleTimerSet||(this.throttleTimerSet=!0,setTimeout(function(){r.messageSendingInterval=re.POST_MESSAGE_ENABLED?null:150},this.THROTTLE_START)),this.sendingMessages=!0,this.sendMessages())},getRegionAndCheckIfChanged:function(t,n){var i=e._getField("MCAAMLH"),r=t.d_region||t.dcs_region;return i?r&&(e._setFieldExpire("MCAAMLH",n),e._setField("MCAAMLH",r),parseInt(i,10)!==r&&(this.regionChanged=!0,this.timesRegionChanged++,e._setField("MCSYNCSOP",""),e._setField("MCSYNCS",""),i=r)):(i=r)&&(e._setFieldExpire("MCAAMLH",n),e._setField("MCAAMLH",i)),i||(i=""),i},processSyncOnPage:function(e){var t,n,i,r;if((t=e.ibs)&&t instanceof Array&&(n=t.length))for(i=0;i<n;i++)r=t[i],r.syncOnPage&&this.checkFirstPartyCookie(r,"","syncOnPage")},process:function(e){var t,n,i,r,a,o=encodeURIComponent,s=!1;if((t=e.ibs)&&t instanceof Array&&(n=t.length))for(s=!0,i=0;i<n;i++)r=t[i],a=[o("ibs"),o(r.id||""),o(r.tag||""),j.encodeAndBuildRequest(r.url||[],","),o(r.ttl||""),"","",r.fireURLSync?"true":"false"],r.syncOnPage||(this.canSetThirdPartyCookies?this.addMessage(a.join("|")):r.fireURLSync&&this.checkFirstPartyCookie(r,a.join("|")));s&&this.jsonProcessed.push(e)},checkFirstPartyCookie:function(t,n,i){var r="syncOnPage"===i,a=r?"MCSYNCSOP":"MCSYNCS";e._readVisitor();var o,s,l=e._getField(a),c=!1,u=!1,d=Math.ceil((new Date).getTime()/re.MILLIS_PER_DAY);l?(o=l.split("*"),s=this.pruneSyncData(o,t.id,d),c=s.dataPresent,u=s.dataValid,c&&u||this.fireSync(r,t,n,o,a,d)):(o=[],this.fireSync(r,t,n,o,a,d))},pruneSyncData:function(e,t,n){var i,r,a,o=!1,s=!1;for(r=0;r<e.length;r++)i=e[r],a=parseInt(i.split("-")[1],10),i.match("^"+t+"-")?(o=!0,n<a?s=!0:(e.splice(r,1),r--)):n>=a&&(e.splice(r,1),r--);return{dataPresent:o,dataValid:s}},manageSyncsSize:function(e){if(e.join("*").length>this.MAX_SYNCS_LENGTH)for(e.sort(function(e,t){return parseInt(e.split("-")[1],10)-parseInt(t.split("-")[1],10)});e.join("*").length>this.MAX_SYNCS_LENGTH;)e.shift()},fireSync:function(t,n,i,r,a,o){var s=this;if(t){if("img"===n.tag){var l,c,u,d,f=n.url,p=e.loadSSL?"https:":"http:";for(l=0,c=f.length;l<c;l++){u=f[l],d=/^\/\//.test(u);var g=new Image;g.addEventListener("load",function(t,n,i,r){return function(){s.onPagePixels[t]=null,e._readVisitor();var o,l=e._getField(a),c=[];if(l){o=l.split("*");var u,d,f;for(u=0,d=o.length;u<d;u++)f=o[u],f.match("^"+n.id+"-")||c.push(f)}s.setSyncTrackingData(c,n,i,r)}}(this.onPagePixels.length,n,a,o)),g.src=(d?p:"")+u,this.onPagePixels.push(g)}}}else this.addMessage(i),this.setSyncTrackingData(r,n,a,o)},addMessage:function(t){var n=encodeURIComponent,i=n(e._enableErrorReporting?"---destpub-debug---":"---destpub---");this.messages.push((re.POST_MESSAGE_ENABLED?"":i)+t)},setSyncTrackingData:function(t,n,i,r){t.push(n.id+"-"+(r+Math.ceil(n.ttl/60/24))),this.manageSyncsSize(t),e._setField(i,t.join("*"))},sendMessages:function(){var e,t=this,n="",i=encodeURIComponent;this.regionChanged&&(n=i("---destpub-clear-dextp---"),this.regionChanged=!1),this.messages.length?re.POST_MESSAGE_ENABLED?(e=n+i("---destpub-combined---")+this.messages.join("%01"),this.postMessage(e),this.messages=[],this.sendingMessages=!1):(e=this.messages.shift(),this.postMessage(n+e),setTimeout(function(){t.sendMessages()},this.messageSendingInterval)):this.sendingMessages=!1},postMessage:function(e){te.postMessage(e,this.url,this.iframe.contentWindow),this.messagesPosted.push(e)},receiveMessage:function(e){var t,n=/^---destpub-to-parent---/;"string"==typeof e&&n.test(e)&&(t=e.replace(n,"").split("|"),"canSetThirdPartyCookies"===t[0]&&(this.canSetThirdPartyCookies="true"===t[1],this.receivedThirdPartyCookiesNotification=!0,this.requestToProcess()),this.messagesReceived.push(e))},processIDCallData:function(i){(null==this.url||i.subdomain&&"nosubdomainreturned"===this.subdomain)&&("string"==typeof e._subdomain&&e._subdomain.length?this.subdomain=e._subdomain:this.subdomain=i.subdomain||"",this.url=this.getUrl()),i.ibs instanceof Array&&i.ibs.length&&(this.doAttachIframe=!0),this.readyToAttachIframe()&&(e.idSyncAttachIframeOnWindowLoad?(t.windowLoaded||"complete"===n.readyState||"loaded"===n.readyState)&&this.attachIframe():this.attachIframeASAP()),"function"==typeof e.idSyncIDCallResult?e.idSyncIDCallResult(i):this.requestToProcess(i),"function"==typeof e.idSyncAfterIDCallResult&&e.idSyncAfterIDCallResult(i)},canMakeSyncIDCall:function(t,n){return e._forceSyncIDCall||!t||n-t>re.DAYS_BETWEEN_SYNC_ID_CALLS},attachIframeASAP:function(){function e(){t.startedAttachingIframe||(n.body?t.attachIframe():setTimeout(e,30))}var t=this;e()}}},oe={audienceManagerServer:{},audienceManagerServerSecure:{},cookieDomain:{},cookieLifetime:{},cookieName:{},doesOptInApply:{},disableThirdPartyCalls:{},discardTrackingServerECID:{},idSyncAfterIDCallResult:{},idSyncAttachIframeOnWindowLoad:{},idSyncContainerID:{},idSyncDisable3rdPartySyncing:{},disableThirdPartyCookies:{},idSyncDisableSyncs:{},disableIdSyncs:{},idSyncIDCallResult:{},idSyncSSLUseAkamai:{},isCoopSafe:{},isIabContext:{},isOptInStorageEnabled:{},loadSSL:{},loadTimeout:{},marketingCloudServer:{},marketingCloudServerSecure:{},optInCookieDomain:{},optInStorageExpiry:{},overwriteCrossDomainMCIDAndAID:{},preOptInApprovals:{},previousPermissions:{},resetBeforeVersion:{},sdidParamExpiry:{},serverState:{},sessionCookieName:{},secureCookie:{},takeTimeoutMetrics:{},trackingServer:{},trackingServerSecure:{},whitelistIframeDomains:{},whitelistParentDomain:{}},se={getConfigNames:function(){return Object.keys(oe)},getConfigs:function(){return oe},normalizeConfig:function(e){return"function"!=typeof e?e:e()}},le=function(e){var t={};return e.on=function(e,n,i){if(!n||"function"!=typeof n)throw new Error("[ON] Callback should be a function.");t.hasOwnProperty(e)||(t[e]=[]);var r=t[e].push({callback:n,context:i})-1;return function(){t[e].splice(r,1),t[e].length||delete t[e]}},e.off=function(e,n){t.hasOwnProperty(e)&&(t[e]=t[e].filter(function(e){if(e.callback!==n)return e}))},e.publish=function(e){if(t.hasOwnProperty(e)){var n=[].slice.call(arguments,1);t[e].slice(0).forEach(function(e){e.callback.apply(e.context,n)})}},e.publish},ce={PENDING:"pending",CHANGED:"changed",COMPLETE:"complete"},ue={AAM:"aam",ADCLOUD:"adcloud",ANALYTICS:"aa",CAMPAIGN:"campaign",ECID:"ecid",LIVEFYRE:"livefyre",TARGET:"target",MEDIA_ANALYTICS:"mediaaa"},de=(C={},t(C,ue.AAM,565),t(C,ue.ECID,565),C),fe=(I={},t(I,ue.AAM,[1,2,5]),t(I,ue.ECID,[1,2,5]),I),pe=function(e){return Object.keys(e).map(function(t){return e[t]})}(ue),ge=function(){var e={};return e.callbacks=Object.create(null),e.add=function(t,n){if(!c(n))throw new Error("[callbackRegistryFactory] Make sure callback is a function or an array of functions.");e.callbacks[t]=e.callbacks[t]||[];var i=e.callbacks[t].push(n)-1;return function(){e.callbacks[t].splice(i,1)}},e.execute=function(t,n){if(e.callbacks[t]){n=void 0===n?[]:n,n=n instanceof Array?n:[n];try{for(;e.callbacks[t].length;){var i=e.callbacks[t].shift();"function"==typeof i?i.apply(null,n):i instanceof Array&&i[1].apply(i[0],n)}delete e.callbacks[t]}catch(e){}}},e.executeAll=function(t,n){(n||t&&!l(t))&&Object.keys(e.callbacks).forEach(function(n){var i=void 0!==t[n]?t[n]:"";e.execute(n,i)},e)},e.hasCallbacks=function(){return Boolean(Object.keys(e.callbacks).length)},e},me=function(){},he=function(e){var t=window,n=t.console;return!!n&&"function"==typeof n[e]},_e=function(e,t,n){return n()?function(){if(he(e)){for(var n=arguments.length,i=new Array(n),r=0;r<n;r++)i[r]=arguments[r];console[e].apply(console,[t].concat(i))}}:me},Ce=u,Ie=new Ce("[ADOBE OPT-IN]"),ve=function(t,n){return e(t)===n},De=function(e,t){return e instanceof Array?e:ve(e,"string")?[e]:t||[]},Se=function(e){var t=Object.keys(e);return!!t.length&&t.every(function(t){return!0===e[t]})},Ae=function(e){return!(!e||Oe(e))&&De(e).every(function(e){return pe.indexOf(e)>-1})},ye=function(e,t){return e.reduce(function(e,n){return e[n]=t,e},{})},be=function(e){return JSON.parse(JSON.stringify(e))},Oe=function(e){return"[object Array]"===Object.prototype.toString.call(e)&&!e.length},Me=function(e){if(Te(e))return e;try{return JSON.parse(e)}catch(e){return{}}},ke=function(e){return void 0===e||(Te(e)?Ae(Object.keys(e)):Ee(e))},Ee=function(e){try{var t=JSON.parse(e);return!!e&&ve(e,"string")&&Ae(Object.keys(t))}catch(e){return!1}},Te=function(e){return null!==e&&ve(e,"object")&&!1===Array.isArray(e)},Pe=function(){},Le=function(e){return ve(e,"function")?e():e},Re=function(e,t){ke(e)||Ie.error("".concat(t))},we=function(e){return Object.keys(e).map(function(t){return e[t]})},Fe=function(e){return we(e).filter(function(e,t,n){return n.indexOf(e)===t})},Ne=function(e){return function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=t.command,i=t.params,r=void 0===i?{}:i,a=t.callback,o=void 0===a?Pe:a;if(!n||-1===n.indexOf("."))throw new Error("[OptIn.execute] Please provide a valid command.");try{var s=n.split("."),l=e[s[0]],c=s[1];if(!l||"function"!=typeof l[c])throw new Error("Make sure the plugin and API name exist.");var u=Object.assign(r,{callback:o});l[c].call(l,u)}catch(e){Ie.error("[execute] Something went wrong: "+e.message)}}};f.prototype=Object.create(Error.prototype),f.prototype.constructor=f;var xe="fetchPermissions",je="[OptIn#registerPlugin] Plugin is invalid.";p.Categories=ue,p.TimeoutError=f;var Ve=Object.freeze({OptIn:p,IabPlugin:h}),Ue=function(e,t){e.publishDestinations=function(n){var i=arguments[1],r=arguments[2];try{r="function"==typeof r?r:n.callback}catch(e){r=function(){}}var a=t;if(!a.readyToAttachIframePreliminary())return void r({error:"The destination publishing iframe is disabled in the Visitor library."});if("string"==typeof n){if(!n.length)return void r({error:"subdomain is not a populated string."});if(!(i instanceof Array&&i.length))return void r({error:"messages is not a populated array."});var o=!1
;if(i.forEach(function(e){"string"==typeof e&&e.length&&(a.addMessage(e),o=!0)}),!o)return void r({error:"None of the messages are populated strings."})}else{if(!j.isObject(n))return void r({error:"Invalid parameters passed."});var s=n;if("string"!=typeof(n=s.subdomain)||!n.length)return void r({error:"config.subdomain is not a populated string."});var l=s.urlDestinations;if(!(l instanceof Array&&l.length))return void r({error:"config.urlDestinations is not a populated array."});var c=[];l.forEach(function(e){j.isObject(e)&&(e.hideReferrer?e.message&&a.addMessage(e.message):c.push(e))});!function e(){c.length&&setTimeout(function(){var t=new Image,n=c.shift();t.src=n.url,a.onPageDestinationsFired.push(n),e()},100)}()}a.iframe?(r({message:"The destination publishing iframe is already attached and loaded."}),a.requestToProcess()):!e.subdomain&&e._getField("MCMID")?(a.subdomain=n,a.doAttachIframe=!0,a.url=a.getUrl(),a.readyToAttachIframe()?(a.iframeLoadedCallbacks.push(function(e){r({message:"Attempted to attach and load the destination publishing iframe through this API call. Result: "+(e.message||"no result")})}),a.attachIframe()):r({error:"Encountered a problem in attempting to attach and load the destination publishing iframe through this API call."})):a.iframeLoadedCallbacks.push(function(e){r({message:"Attempted to attach and load the destination publishing iframe through normal Visitor API processing. Result: "+(e.message||"no result")})})}},He=function e(t){function n(e,t){return e>>>t|e<<32-t}for(var i,r,a=Math.pow,o=a(2,32),s="",l=[],c=8*t.length,u=e.h=e.h||[],d=e.k=e.k||[],f=d.length,p={},g=2;f<64;g++)if(!p[g]){for(i=0;i<313;i+=g)p[i]=g;u[f]=a(g,.5)*o|0,d[f++]=a(g,1/3)*o|0}for(t+="ย€";t.length%64-56;)t+="\0";for(i=0;i<t.length;i++){if((r=t.charCodeAt(i))>>8)return;l[i>>2]|=r<<(3-i)%4*8}for(l[l.length]=c/o|0,l[l.length]=c,r=0;r<l.length;){var m=l.slice(r,r+=16),h=u;for(u=u.slice(0,8),i=0;i<64;i++){var _=m[i-15],C=m[i-2],I=u[0],v=u[4],D=u[7]+(n(v,6)^n(v,11)^n(v,25))+(v&u[5]^~v&u[6])+d[i]+(m[i]=i<16?m[i]:m[i-16]+(n(_,7)^n(_,18)^_>>>3)+m[i-7]+(n(C,17)^n(C,19)^C>>>10)|0);u=[D+((n(I,2)^n(I,13)^n(I,22))+(I&u[1]^I&u[2]^u[1]&u[2]))|0].concat(u),u[4]=u[4]+D|0}for(i=0;i<8;i++)u[i]=u[i]+h[i]|0}for(i=0;i<8;i++)for(r=3;r+1;r--){var S=u[i]>>8*r&255;s+=(S<16?0:"")+S.toString(16)}return s},Be=function(e,t){return"SHA-256"!==t&&"SHA256"!==t&&"sha256"!==t&&"sha-256"!==t||(e=He(e)),e},Ge=function(e){return String(e).trim().toLowerCase()},Ye=Ve.OptIn;j.defineGlobalNamespace(),window.adobe.OptInCategories=Ye.Categories;var qe=function(t,n,i){function r(e){var t=e;return function(e){var n=e||D.location.href;try{var i=m._extractParamFromUri(n,t);if(i)return N.parsePipeDelimetedKeyValues(i)}catch(e){}}}function a(e){function t(e,t,n){e&&e.match(re.VALID_VISITOR_ID_REGEX)&&(n===y&&(v=!0),t(e))}t(e[y],m.setMarketingCloudVisitorID,y),m._setFieldExpire(T,-1),t(e[M],m.setAnalyticsVisitorID)}function o(e){e=e||{},m._supplementalDataIDCurrent=e.supplementalDataIDCurrent||"",m._supplementalDataIDCurrentConsumed=e.supplementalDataIDCurrentConsumed||{},m._supplementalDataIDLast=e.supplementalDataIDLast||"",m._supplementalDataIDLastConsumed=e.supplementalDataIDLastConsumed||{}}function s(e){function t(e,t,n){return n=n?n+="|":n,n+=e+"="+encodeURIComponent(t)}function n(e,n){var i=n[0],r=n[1];return null!=r&&r!==P&&(e=t(i,r,e)),e}var i=e.reduce(n,"");return function(e){var t=N.getTimestampInSeconds();return e=e?e+="|":e,e+="TS="+t}(i)}function l(e){var t=e.minutesToLive,n="";return(m.idSyncDisableSyncs||m.disableIdSyncs)&&(n=n||"Error: id syncs have been disabled"),"string"==typeof e.dpid&&e.dpid.length||(n=n||"Error: config.dpid is empty"),"string"==typeof e.url&&e.url.length||(n=n||"Error: config.url is empty"),void 0===t?t=20160:(t=parseInt(t,10),(isNaN(t)||t<=0)&&(n=n||"Error: config.minutesToLive needs to be a positive number")),{error:n,ttl:t}}function c(){return!!m.configs.doesOptInApply&&!(h.optIn.isComplete&&u())}function u(){return m.configs.doesOptInApply&&m.configs.isIabContext?h.optIn.isApproved(h.optIn.Categories.ECID)&&I:h.optIn.isApproved(h.optIn.Categories.ECID)}function d(){[["getMarketingCloudVisitorID"],["setCustomerIDs",void 0],["getAnalyticsVisitorID"],["getAudienceManagerLocationHint"],["getLocationHint"],["getAudienceManagerBlob"]].forEach(function(e){var t=e[0],n=2===e.length?e[1]:"",i=m[t];m[t]=function(e){return u()&&m.isAllowed()?i.apply(m,arguments):("function"==typeof e&&m._callCallback(e,[n]),n)}})}function f(e,t){if(I=!0,e)throw new Error("[IAB plugin] : "+e);t.gdprApplies&&(C=t.consentString),m.init(),g()}function p(){h.optIn.isComplete&&(h.optIn.isApproved(h.optIn.Categories.ECID)?m.configs.isIabContext?h.optIn.execute({command:"iabPlugin.fetchConsentData",callback:f}):(m.init(),g()):(d(),g()))}function g(){h.optIn.off("complete",p)}if(!i||i.split("").reverse().join("")!==t)throw new Error("Please use `Visitor.getInstance` to instantiate Visitor.");var m=this,h=window.adobe,C="",I=!1,v=!1;m.version="4.6.0";var D=_,S=D.Visitor;S.version=m.version,S.AuthState=E.AUTH_STATE,S.OptOut=E.OPT_OUT,D.s_c_in||(D.s_c_il=[],D.s_c_in=0),m._c="Visitor",m._il=D.s_c_il,m._in=D.s_c_in,m._il[m._in]=m,D.s_c_in++,m._instanceType="regular",m._log={requests:[]},m.marketingCloudOrgID=t,m.cookieName="AMCV_"+t,m.sessionCookieName="AMCVS_"+t,m.cookieDomain=$(),m.loadSSL=!0,m.loadTimeout=3e4,m.CORSErrors=[],m.marketingCloudServer=m.audienceManagerServer="dpm.demdex.net",m.sdidParamExpiry=30;var A=null,y="MCMID",b="MCIDTS",O="A",M="MCAID",k="AAM",T="MCAAMB",P="NONE",L=function(e){return!Object.prototype[e]},R=ie(m);m.FIELDS=E.FIELDS,m.cookieRead=function(e){return Q.get(e)},m.cookieWrite=function(e,t,n){var i=m.cookieLifetime?(""+m.cookieLifetime).toUpperCase():"",r=!1;return m.configs&&m.configs.secureCookie&&"https:"===location.protocol&&(r=!0),Q.set(e,""+t,{expires:n,domain:m.cookieDomain,cookieLifetime:i,secure:r})},m.resetState=function(e){e?m._mergeServerState(e):o()},m._isAllowedDone=!1,m._isAllowedFlag=!1,m.isAllowed=function(){return m._isAllowedDone||(m._isAllowedDone=!0,(m.cookieRead(m.cookieName)||m.cookieWrite(m.cookieName,"T",1))&&(m._isAllowedFlag=!0)),"T"===m.cookieRead(m.cookieName)&&m._helpers.removeCookie(m.cookieName),m._isAllowedFlag},m.setMarketingCloudVisitorID=function(e){m._setMarketingCloudFields(e)},m._use1stPartyMarketingCloudServer=!1,m.getMarketingCloudVisitorID=function(e,t){m.marketingCloudServer&&m.marketingCloudServer.indexOf(".demdex.net")<0&&(m._use1stPartyMarketingCloudServer=!0);var n=m._getAudienceManagerURLData("_setMarketingCloudFields"),i=n.url;return m._getRemoteField(y,i,e,t,n)};var w=function(e,t){var n={};m.getMarketingCloudVisitorID(function(){t.forEach(function(e){n[e]=m._getField(e,!0)}),-1!==t.indexOf("MCOPTOUT")?m.isOptedOut(function(t){n.MCOPTOUT=t,e(n)},null,!0):e(n)},!0)};m.getVisitorValues=function(e,t){var n={MCMID:{fn:m.getMarketingCloudVisitorID,args:[!0],context:m},MCOPTOUT:{fn:m.isOptedOut,args:[void 0,!0],context:m},MCAID:{fn:m.getAnalyticsVisitorID,args:[!0],context:m},MCAAMLH:{fn:m.getAudienceManagerLocationHint,args:[!0],context:m},MCAAMB:{fn:m.getAudienceManagerBlob,args:[!0],context:m}},i=t&&t.length?j.pluck(n,t):n;t&&-1===t.indexOf("MCAID")?w(e,t):z(i,e)},m._currentCustomerIDs={},m._customerIDsHashChanged=!1,m._newCustomerIDsHash="",m.setCustomerIDs=function(t,n){function i(){m._customerIDsHashChanged=!1}if(!m.isOptedOut()&&t){if(!j.isObject(t)||j.isObjectEmpty(t))return!1;m._readVisitor();var r,a,o;for(r in t)if(L(r)&&(a=t[r],n=a.hasOwnProperty("hashType")?a.hashType:n,a))if("object"===e(a)){var s={};if(a.id){if(n){if(!(o=Be(Ge(a.id),n)))return;a.id=o,s.hashType=n}s.id=a.id}void 0!=a.authState&&(s.authState=a.authState),m._currentCustomerIDs[r]=s}else if(n){if(!(o=Be(Ge(a),n)))return;m._currentCustomerIDs[r]={id:o,hashType:n}}else m._currentCustomerIDs[r]={id:a};var l=m.getCustomerIDs(),c=m._getField("MCCIDH"),u="";c||(c=0);for(r in l)L(r)&&(a=l[r],u+=(u?"|":"")+r+"|"+(a.id?a.id:"")+(a.authState?a.authState:""));m._newCustomerIDsHash=String(m._hash(u)),m._newCustomerIDsHash!==c&&(m._customerIDsHashChanged=!0,m._mapCustomerIDs(i))}},m.getCustomerIDs=function(){m._readVisitor();var e,t,n={};for(e in m._currentCustomerIDs)L(e)&&(t=m._currentCustomerIDs[e],t.id&&(n[e]||(n[e]={}),n[e].id=t.id,void 0!=t.authState?n[e].authState=t.authState:n[e].authState=S.AuthState.UNKNOWN,t.hashType&&(n[e].hashType=t.hashType)));return n},m.setAnalyticsVisitorID=function(e){m._setAnalyticsFields(e)},m.getAnalyticsVisitorID=function(e,t,n){if(!N.isTrackingServerPopulated()&&!n)return m._callCallback(e,[""]),"";var i="";if(n||(i=m.getMarketingCloudVisitorID(function(t){m.getAnalyticsVisitorID(e,!0)})),i||n){var r=n?m.marketingCloudServer:m.trackingServer,a="";m.loadSSL&&(n?m.marketingCloudServerSecure&&(r=m.marketingCloudServerSecure):m.trackingServerSecure&&(r=m.trackingServerSecure));var o={};if(r){var s="http"+(m.loadSSL?"s":"")+"://"+r+"/id",l="d_visid_ver="+m.version+"&mcorgid="+encodeURIComponent(m.marketingCloudOrgID)+(i?"&mid="+encodeURIComponent(i):"")+(m.idSyncDisable3rdPartySyncing||m.disableThirdPartyCookies?"&d_coppa=true":""),c=["s_c_il",m._in,"_set"+(n?"MarketingCloud":"Analytics")+"Fields"];a=s+"?"+l+"&callback=s_c_il%5B"+m._in+"%5D._set"+(n?"MarketingCloud":"Analytics")+"Fields",o.corsUrl=s+"?"+l,o.callback=c}return o.url=a,m._getRemoteField(n?y:M,a,e,t,o)}return""},m.getAudienceManagerLocationHint=function(e,t){if(m.getMarketingCloudVisitorID(function(t){m.getAudienceManagerLocationHint(e,!0)})){var n=m._getField(M);if(!n&&N.isTrackingServerPopulated()&&(n=m.getAnalyticsVisitorID(function(t){m.getAudienceManagerLocationHint(e,!0)})),n||!N.isTrackingServerPopulated()){var i=m._getAudienceManagerURLData(),r=i.url;return m._getRemoteField("MCAAMLH",r,e,t,i)}}return""},m.getLocationHint=m.getAudienceManagerLocationHint,m.getAudienceManagerBlob=function(e,t){if(m.getMarketingCloudVisitorID(function(t){m.getAudienceManagerBlob(e,!0)})){var n=m._getField(M);if(!n&&N.isTrackingServerPopulated()&&(n=m.getAnalyticsVisitorID(function(t){m.getAudienceManagerBlob(e,!0)})),n||!N.isTrackingServerPopulated()){var i=m._getAudienceManagerURLData(),r=i.url;return m._customerIDsHashChanged&&m._setFieldExpire(T,-1),m._getRemoteField(T,r,e,t,i)}}return""},m._supplementalDataIDCurrent="",m._supplementalDataIDCurrentConsumed={},m._supplementalDataIDLast="",m._supplementalDataIDLastConsumed={},m.getSupplementalDataID=function(e,t){m._supplementalDataIDCurrent||t||(m._supplementalDataIDCurrent=m._generateID(1));var n=m._supplementalDataIDCurrent;return m._supplementalDataIDLast&&!m._supplementalDataIDLastConsumed[e]?(n=m._supplementalDataIDLast,m._supplementalDataIDLastConsumed[e]=!0):n&&(m._supplementalDataIDCurrentConsumed[e]&&(m._supplementalDataIDLast=m._supplementalDataIDCurrent,m._supplementalDataIDLastConsumed=m._supplementalDataIDCurrentConsumed,m._supplementalDataIDCurrent=n=t?"":m._generateID(1),m._supplementalDataIDCurrentConsumed={}),n&&(m._supplementalDataIDCurrentConsumed[e]=!0)),n};var F=!1;m._liberatedOptOut=null,m.getOptOut=function(e,t){var n=m._getAudienceManagerURLData("_setMarketingCloudFields"),i=n.url;if(u())return m._getRemoteField("MCOPTOUT",i,e,t,n);if(m._registerCallback("liberatedOptOut",e),null!==m._liberatedOptOut)return m._callAllCallbacks("liberatedOptOut",[m._liberatedOptOut]),F=!1,m._liberatedOptOut;if(F)return null;F=!0;var r="liberatedGetOptOut";return n.corsUrl=n.corsUrl.replace(/dpm\.demdex\.net\/id\?/,"dpm.demdex.net/optOutStatus?"),n.callback=[r],_[r]=function(e){if(e===Object(e)){var t,n,i=j.parseOptOut(e,t,P);t=i.optOut,n=1e3*i.d_ottl,m._liberatedOptOut=t,setTimeout(function(){m._liberatedOptOut=null},n)}m._callAllCallbacks("liberatedOptOut",[t]),F=!1},R.fireCORS(n),null},m.isOptedOut=function(e,t,n){t||(t=S.OptOut.GLOBAL);var i=m.getOptOut(function(n){var i=n===S.OptOut.GLOBAL||n.indexOf(t)>=0;m._callCallback(e,[i])},n);return i?i===S.OptOut.GLOBAL||i.indexOf(t)>=0:null},m._fields=null,m._fieldsExpired=null,m._hash=function(e){var t,n,i=0;if(e)for(t=0;t<e.length;t++)n=e.charCodeAt(t),i=(i<<5)-i+n,i&=i;return i},m._generateID=ne,m._generateLocalMID=function(){var e=m._generateID(0);return V.isClientSideMarketingCloudVisitorID=!0,e},m._callbackList=null,m._callCallback=function(e,t){try{"function"==typeof e?e.apply(D,t):e[1].apply(e[0],t)}catch(e){}},m._registerCallback=function(e,t){t&&(null==m._callbackList&&(m._callbackList={}),void 0==m._callbackList[e]&&(m._callbackList[e]=[]),m._callbackList[e].push(t))},m._callAllCallbacks=function(e,t){if(null!=m._callbackList){var n=m._callbackList[e];if(n)for(;n.length>0;)m._callCallback(n.shift(),t)}},m._addQuerystringParam=function(e,t,n,i){var r=encodeURIComponent(t)+"="+encodeURIComponent(n),a=N.parseHash(e),o=N.hashlessUrl(e);if(-1===o.indexOf("?"))return o+"?"+r+a;var s=o.split("?"),l=s[0]+"?",c=s[1];return l+N.addQueryParamAtLocation(c,r,i)+a},m._extractParamFromUri=function(e,t){var n=new RegExp("[\\?&#]"+t+"=([^&#]*)"),i=n.exec(e);if(i&&i.length)return decodeURIComponent(i[1])},m._parseAdobeMcFromUrl=r(re.ADOBE_MC),m._parseAdobeMcSdidFromUrl=r(re.ADOBE_MC_SDID),m._attemptToPopulateSdidFromUrl=function(e){var n=m._parseAdobeMcSdidFromUrl(e),i=1e9;n&&n.TS&&(i=N.getTimestampInSeconds()-n.TS),n&&n.SDID&&n.MCORGID===t&&i<m.sdidParamExpiry&&(m._supplementalDataIDCurrent=n.SDID,m._supplementalDataIDCurrentConsumed.SDID_URL_PARAM=!0)},m._attemptToPopulateIdsFromUrl=function(){var e=m._parseAdobeMcFromUrl();if(e&&e.TS){var n=N.getTimestampInSeconds(),i=n-e.TS;if(Math.floor(i/60)>re.ADOBE_MC_TTL_IN_MIN||e.MCORGID!==t)return;a(e)}},m._mergeServerState=function(e){if(e)try{if(e=function(e){return N.isObject(e)?e:JSON.parse(e)}(e),e[m.marketingCloudOrgID]){var t=e[m.marketingCloudOrgID];!function(e){N.isObject(e)&&m.setCustomerIDs(e)}(t.customerIDs),o(t.sdid)}}catch(e){throw new Error("`serverState` has an invalid format.")}},m._timeout=null,m._loadData=function(e,t,n,i){t=m._addQuerystringParam(t,"d_fieldgroup",e,1),i.url=m._addQuerystringParam(i.url,"d_fieldgroup",e,1),i.corsUrl=m._addQuerystringParam(i.corsUrl,"d_fieldgroup",e,1),V.fieldGroupObj[e]=!0,i===Object(i)&&i.corsUrl&&"XMLHttpRequest"===R.corsMetadata.corsType&&R.fireCORS(i,n,e)},m._clearTimeout=function(e){null!=m._timeout&&m._timeout[e]&&(clearTimeout(m._timeout[e]),m._timeout[e]=0)},m._settingsDigest=0,m._getSettingsDigest=function(){if(!m._settingsDigest){var e=m.version;m.audienceManagerServer&&(e+="|"+m.audienceManagerServer),m.audienceManagerServerSecure&&(e+="|"+m.audienceManagerServerSecure),m._settingsDigest=m._hash(e)}return m._settingsDigest},m._readVisitorDone=!1,m._readVisitor=function(){if(!m._readVisitorDone){m._readVisitorDone=!0;var e,t,n,i,r,a,o=m._getSettingsDigest(),s=!1,l=m.cookieRead(m.cookieName),c=new Date;if(l||v||m.discardTrackingServerECID||(l=m.cookieRead(re.FIRST_PARTY_SERVER_COOKIE)),null==m._fields&&(m._fields={}),l&&"T"!==l)for(l=l.split("|"),l[0].match(/^[\-0-9]+$/)&&(parseInt(l[0],10)!==o&&(s=!0),l.shift()),l.length%2==1&&l.pop(),e=0;e<l.length;e+=2)t=l[e].split("-"),n=t[0],i=l[e+1],t.length>1?(r=parseInt(t[1],10),a=t[1].indexOf("s")>0):(r=0,a=!1),s&&("MCCIDH"===n&&(i=""),r>0&&(r=c.getTime()/1e3-60)),n&&i&&(m._setField(n,i,1),r>0&&(m._fields["expire"+n]=r+(a?"s":""),(c.getTime()>=1e3*r||a&&!m.cookieRead(m.sessionCookieName))&&(m._fieldsExpired||(m._fieldsExpired={}),m._fieldsExpired[n]=!0)));!m._getField(M)&&N.isTrackingServerPopulated()&&(l=m.cookieRead("s_vi"))&&(l=l.split("|"),l.length>1&&l[0].indexOf("v1")>=0&&(i=l[1],e=i.indexOf("["),e>=0&&(i=i.substring(0,e)),i&&i.match(re.VALID_VISITOR_ID_REGEX)&&m._setField(M,i)))}},m._appendVersionTo=function(e){var t="vVersion|"+m.version,n=e?m._getCookieVersion(e):null;return n?Z.areVersionsDifferent(n,m.version)&&(e=e.replace(re.VERSION_REGEX,t)):e+=(e?"|":"")+t,e},m._writeVisitor=function(){var e,t,n=m._getSettingsDigest();for(e in m._fields)L(e)&&m._fields[e]&&"expire"!==e.substring(0,6)&&(t=m._fields[e],n+=(n?"|":"")+e+(m._fields["expire"+e]?"-"+m._fields["expire"+e]:"")+"|"+t);n=m._appendVersionTo(n),m.cookieWrite(m.cookieName,n,1)},m._getField=function(e,t){return null==m._fields||!t&&m._fieldsExpired&&m._fieldsExpired[e]?null:m._fields[e]},m._setField=function(e,t,n){null==m._fields&&(m._fields={}),m._fields[e]=t,n||m._writeVisitor()},m._getFieldList=function(e,t){var n=m._getField(e,t);return n?n.split("*"):null},m._setFieldList=function(e,t,n){m._setField(e,t?t.join("*"):"",n)},m._getFieldMap=function(e,t){var n=m._getFieldList(e,t);if(n){var i,r={};for(i=0;i<n.length;i+=2)r[n[i]]=n[i+1];return r}return null},m._setFieldMap=function(e,t,n){var i,r=null;if(t){r=[];for(i in t)L(i)&&(r.push(i),r.push(t[i]))}m._setFieldList(e,r,n)},m._setFieldExpire=function(e,t,n){var i=new Date;i.setTime(i.getTime()+1e3*t),null==m._fields&&(m._fields={}),m._fields["expire"+e]=Math.floor(i.getTime()/1e3)+(n?"s":""),t<0?(m._fieldsExpired||(m._fieldsExpired={}),m._fieldsExpired[e]=!0):m._fieldsExpired&&(m._fieldsExpired[e]=!1),n&&(m.cookieRead(m.sessionCookieName)||m.cookieWrite(m.sessionCookieName,"1"))},m._findVisitorID=function(t){return t&&("object"===e(t)&&(t=t.d_mid?t.d_mid:t.visitorID?t.visitorID:t.id?t.id:t.uuid?t.uuid:""+t),t&&"NOTARGET"===(t=t.toUpperCase())&&(t=P),t&&(t===P||t.match(re.VALID_VISITOR_ID_REGEX))||(t="")),t},m._setFields=function(t,n){if(m._clearTimeout(t),null!=m._loading&&(m._loading[t]=!1),V.fieldGroupObj[t]&&V.setState(t,!1),"MC"===t){!0!==V.isClientSideMarketingCloudVisitorID&&(V.isClientSideMarketingCloudVisitorID=!1);var i=m._getField(y);if(!i||m.overwriteCrossDomainMCIDAndAID){if(!(i="object"===e(n)&&n.mid?n.mid:m._findVisitorID(n))){if(m._use1stPartyMarketingCloudServer&&!m.tried1stPartyMarketingCloudServer)return m.tried1stPartyMarketingCloudServer=!0,void m.getAnalyticsVisitorID(null,!1,!0);i=m._generateLocalMID()}m._setField(y,i)}i&&i!==P||(i=""),"object"===e(n)&&((n.d_region||n.dcs_region||n.d_blob||n.blob)&&m._setFields(k,n),m._use1stPartyMarketingCloudServer&&n.mid&&m._setFields(O,{id:n.id})),m._callAllCallbacks(y,[i])}if(t===k&&"object"===e(n)){var r=604800;void 0!=n.id_sync_ttl&&n.id_sync_ttl&&(r=parseInt(n.id_sync_ttl,10));var a=x.getRegionAndCheckIfChanged(n,r);m._callAllCallbacks("MCAAMLH",[a]);var o=m._getField(T);(n.d_blob||n.blob)&&(o=n.d_blob,o||(o=n.blob),m._setFieldExpire(T,r),m._setField(T,o)),o||(o=""),m._callAllCallbacks(T,[o]),!n.error_msg&&m._newCustomerIDsHash&&m._setField("MCCIDH",m._newCustomerIDsHash)}if(t===O){var s=m._getField(M);s&&!m.overwriteCrossDomainMCIDAndAID||(s=m._findVisitorID(n),s?s!==P&&m._setFieldExpire(T,-1):s=P,m._setField(M,s)),s&&s!==P||(s=""),m._callAllCallbacks(M,[s])}if(m.idSyncDisableSyncs||m.disableIdSyncs)x.idCallNotProcesssed=!0;else{x.idCallNotProcesssed=!1;var l={};l.ibs=n.ibs,l.subdomain=n.subdomain,x.processIDCallData(l)}if(n===Object(n)){var c,d;u()&&m.isAllowed()&&(c=m._getField("MCOPTOUT"));var f=j.parseOptOut(n,c,P);c=f.optOut,d=f.d_ottl,m._setFieldExpire("MCOPTOUT",d,!0),m._setField("MCOPTOUT",c),m._callAllCallbacks("MCOPTOUT",[c])}},m._loading=null,m._getRemoteField=function(e,t,n,i,r){var a,o="",s=N.isFirstPartyAnalyticsVisitorIDCall(e),l={MCAAMLH:!0,MCAAMB:!0};if(u()&&m.isAllowed()){m._readVisitor(),o=m._getField(e,!0===l[e]);if(function(){return(!o||m._fieldsExpired&&m._fieldsExpired[e])&&(!m.disableThirdPartyCalls||s)}()){if(e===y||"MCOPTOUT"===e?a="MC":"MCAAMLH"===e||e===T?a=k:e===M&&(a=O),a)return!t||null!=m._loading&&m._loading[a]||(null==m._loading&&(m._loading={}),m._loading[a]=!0,m._loadData(a,t,function(t){if(!m._getField(e)){t&&V.setState(a,!0);var n="";e===y?n=m._generateLocalMID():a===k&&(n={error_msg:"timeout"}),m._setFields(a,n)}},r)),m._registerCallback(e,n),o||(t||m._setFields(a,{id:P}),"")}else o||(e===y?(m._registerCallback(e,n),o=m._generateLocalMID(),m.setMarketingCloudVisitorID(o)):e===M?(m._registerCallback(e,n),o="",m.setAnalyticsVisitorID(o)):(o="",i=!0))}return e!==y&&e!==M||o!==P||(o="",i=!0),n&&i&&m._callCallback(n,[o]),o},m._setMarketingCloudFields=function(e){m._readVisitor(),m._setFields("MC",e)},m._mapCustomerIDs=function(e){m.getAudienceManagerBlob(e,!0)},m._setAnalyticsFields=function(e){m._readVisitor(),m._setFields(O,e)},m._setAudienceManagerFields=function(e){m._readVisitor(),m._setFields(k,e)},m._getAudienceManagerURLData=function(e){var t=m.audienceManagerServer,n="",i=m._getField(y),r=m._getField(T,!0),a=m._getField(M),o=a&&a!==P?"&d_cid_ic=AVID%01"+encodeURIComponent(a):"";if(m.loadSSL&&m.audienceManagerServerSecure&&(t=m.audienceManagerServerSecure),t){var s,l,c=m.getCustomerIDs();if(c)for(s in c)L(s)&&(l=c[s],o+="&d_cid_ic="+encodeURIComponent(s)+"%01"+encodeURIComponent(l.id?l.id:"")+(l.authState?"%01"+l.authState:""));e||(e="_setAudienceManagerFields");var u="http"+(m.loadSSL?"s":"")+"://"+t+"/id",d="d_visid_ver="+m.version+(C&&-1!==u.indexOf("demdex.net")?"&gdpr=1&gdpr_force=1&gdpr_consent="+C:"")+"&d_rtbd=json&d_ver=2"+(!i&&m._use1stPartyMarketingCloudServer?"&d_verify=1":"")+"&d_orgid="+encodeURIComponent(m.marketingCloudOrgID)+"&d_nsid="+(m.idSyncContainerID||0)+(i?"&d_mid="+encodeURIComponent(i):"")+(m.idSyncDisable3rdPartySyncing||m.disableThirdPartyCookies?"&d_coppa=true":"")+(!0===A?"&d_coop_safe=1":!1===A?"&d_coop_unsafe=1":"")+(r?"&d_blob="+encodeURIComponent(r):"")+o,f=["s_c_il",m._in,e];return n=u+"?"+d+"&d_cb=s_c_il%5B"+m._in+"%5D."+e,{url:n,corsUrl:u+"?"+d,callback:f}}return{url:n}},m.appendVisitorIDsTo=function(e){try{var t=[[y,m._getField(y)],[M,m._getField(M)],["MCORGID",m.marketingCloudOrgID]];return m._addQuerystringParam(e,re.ADOBE_MC,s(t))}catch(t){return e}},m.appendSupplementalDataIDTo=function(e,t){if(!(t=t||m.getSupplementalDataID(N.generateRandomString(),!0)))return e;try{var n=s([["SDID",t],["MCORGID",m.marketingCloudOrgID]]);return m._addQuerystringParam(e,re.ADOBE_MC_SDID,n)}catch(t){return e}};var N={parseHash:function(e){var t=e.indexOf("#");return t>0?e.substr(t):""},hashlessUrl:function(e){var t=e.indexOf("#");return t>0?e.substr(0,t):e},addQueryParamAtLocation:function(e,t,n){var i=e.split("&");return n=null!=n?n:i.length,i.splice(n,0,t),i.join("&")},isFirstPartyAnalyticsVisitorIDCall:function(e,t,n){if(e!==M)return!1;var i;return t||(t=m.trackingServer),n||(n=m.trackingServerSecure),!("string"!=typeof(i=m.loadSSL?n:t)||!i.length)&&(i.indexOf("2o7.net")<0&&i.indexOf("omtrdc.net")<0)},isObject:function(e){return Boolean(e&&e===Object(e))},removeCookie:function(e){Q.remove(e,{domain:m.cookieDomain})},isTrackingServerPopulated:function(){return!!m.trackingServer||!!m.trackingServerSecure},getTimestampInSeconds:function(){return Math.round((new Date).getTime()/1e3)},parsePipeDelimetedKeyValues:function(e){return e.split("|").reduce(function(e,t){var n=t.split("=");return e[n[0]]=decodeURIComponent(n[1]),e},{})},generateRandomString:function(e){e=e||5;for(var t="",n="abcdefghijklmnopqrstuvwxyz0123456789";e--;)t+=n[Math.floor(Math.random()*n.length)];return t},normalizeBoolean:function(e){return"true"===e||"false"!==e&&e},parseBoolean:function(e){return"true"===e||"false"!==e&&null},replaceMethodsWithFunction:function(e,t){for(var n in e)e.hasOwnProperty(n)&&"function"==typeof e[n]&&(e[n]=t);return e}};m._helpers=N;var x=ae(m,S);m._destinationPublishing=x,m.timeoutMetricsLog=[];var V={isClientSideMarketingCloudVisitorID:null,MCIDCallTimedOut:null,AnalyticsIDCallTimedOut:null,AAMIDCallTimedOut:null,fieldGroupObj:{},setState:function(e,t){switch(e){case"MC":!1===t?!0!==this.MCIDCallTimedOut&&(this.MCIDCallTimedOut=!1):this.MCIDCallTimedOut=t;break;case O:!1===t?!0!==this.AnalyticsIDCallTimedOut&&(this.AnalyticsIDCallTimedOut=!1):this.AnalyticsIDCallTimedOut=t;break;case k:!1===t?!0!==this.AAMIDCallTimedOut&&(this.AAMIDCallTimedOut=!1):this.AAMIDCallTimedOut=t}}};m.isClientSideMarketingCloudVisitorID=function(){return V.isClientSideMarketingCloudVisitorID},m.MCIDCallTimedOut=function(){return V.MCIDCallTimedOut},m.AnalyticsIDCallTimedOut=function(){return V.AnalyticsIDCallTimedOut},m.AAMIDCallTimedOut=function(){return V.AAMIDCallTimedOut},m.idSyncGetOnPageSyncInfo=function(){return m._readVisitor(),m._getField("MCSYNCSOP")},m.idSyncByURL=function(e){if(!m.isOptedOut()){var t=l(e||{});if(t.error)return t.error;var n,i,r=e.url,a=encodeURIComponent,o=x;return r=r.replace(/^https:/,"").replace(/^http:/,""),n=j.encodeAndBuildRequest(["",e.dpid,e.dpuuid||""],","),i=["ibs",a(e.dpid),"img",a(r),t.ttl,"",n],o.addMessage(i.join("|")),o.requestToProcess(),"Successfully queued"}},m.idSyncByDataSource=function(e){if(!m.isOptedOut())return e===Object(e)&&"string"==typeof e.dpuuid&&e.dpuuid.length?(e.url="//dpm.demdex.net/ibs:dpid="+e.dpid+"&dpuuid="+e.dpuuid,m.idSyncByURL(e)):"Error: config or config.dpuuid is empty"},Ue(m,x),m._getCookieVersion=function(e){e=e||m.cookieRead(m.cookieName);var t=re.VERSION_REGEX.exec(e);return t&&t.length>1?t[1]:null},m._resetAmcvCookie=function(e){var t=m._getCookieVersion();t&&!Z.isLessThan(t,e)||N.removeCookie(m.cookieName)},m.setAsCoopSafe=function(){A=!0},m.setAsCoopUnsafe=function(){A=!1},function(){if(m.configs=Object.create(null),N.isObject(n))for(var e in n)L(e)&&(m[e]=n[e],m.configs[e]=n[e])}(),d();var U;m.init=function(){c()&&(h.optIn.fetchPermissions(p,!0),!h.optIn.isApproved(h.optIn.Categories.ECID))||U||(U=!0,function(){if(N.isObject(n)){m.idSyncContainerID=m.idSyncContainerID||0,A="boolean"==typeof m.isCoopSafe?m.isCoopSafe:N.parseBoolean(m.isCoopSafe),m.resetBeforeVersion&&m._resetAmcvCookie(m.resetBeforeVersion),m._attemptToPopulateIdsFromUrl(),m._attemptToPopulateSdidFromUrl(),m._readVisitor();var e=m._getField(b),t=Math.ceil((new Date).getTime()/re.MILLIS_PER_DAY);m.idSyncDisableSyncs||m.disableIdSyncs||!x.canMakeSyncIDCall(e,t)||(m._setFieldExpire(T,-1),m._setField(b,t)),m.getMarketingCloudVisitorID(),m.getAudienceManagerLocationHint(),m.getAudienceManagerBlob(),m._mergeServerState(m.serverState)}else m._attemptToPopulateIdsFromUrl(),m._attemptToPopulateSdidFromUrl()}(),function(){if(!m.idSyncDisableSyncs&&!m.disableIdSyncs){x.checkDPIframeSrc();var e=function(){var e=x;e.readyToAttachIframe()&&e.attachIframe()};D.addEventListener("load",function(){S.windowLoaded=!0,e()});try{te.receiveMessage(function(e){x.receiveMessage(e.data)},x.iframeHost)}catch(e){}}}(),function(){m.whitelistIframeDomains&&re.POST_MESSAGE_ENABLED&&(m.whitelistIframeDomains=m.whitelistIframeDomains instanceof Array?m.whitelistIframeDomains:[m.whitelistIframeDomains],m.whitelistIframeDomains.forEach(function(e){var n=new B(t,e),i=K(m,n);te.receiveMessage(i,e)}))}())}};qe.config=se,_.Visitor=qe;var Xe=qe,We=function(e){if(j.isObject(e))return Object.keys(e).filter(function(t){return""!==e[t]}).reduce(function(t,n){var i=se.normalizeConfig(e[n]),r=j.normalizeBoolean(i);return t[n]=r,t},Object.create(null))},Je=Ve.OptIn,Ke=Ve.IabPlugin;return Xe.getInstance=function(e,t){if(!e)throw new Error("Visitor requires Adobe Marketing Cloud Org ID.");e.indexOf("@")<0&&(e+="@AdobeOrg");var n=function(){var t=_.s_c_il;if(t)for(var n=0;n<t.length;n++){var i=t[n];if(i&&"Visitor"===i._c&&i.marketingCloudOrgID===e)return i}}();if(n)return n;var i=We(t);!function(e){_.adobe.optIn=_.adobe.optIn||function(){var t=j.pluck(e,["doesOptInApply","previousPermissions","preOptInApprovals","isOptInStorageEnabled","optInStorageExpiry","isIabContext"]),n=e.optInCookieDomain||e.cookieDomain;n=n||$(),n=n===window.location.hostname?"":n,t.optInCookieDomain=n;var i=new Je(t,{cookies:Q});if(t.isIabContext&&t.doesOptInApply){var r=new Ke(window.__cmp);i.registerPlugin(r)}return i}()}(i||{});var r=e,a=r.split("").reverse().join(""),o=new Xe(e,null,a);j.isObject(i)&&i.cookieDomain&&(o.cookieDomain=i.cookieDomain),function(){_.s_c_il.splice(--_.s_c_in,1)}();var s=j.getIeVersion();if("number"==typeof s&&s<10)return o._helpers.replaceMethodsWithFunction(o,function(){});var l=function(){try{return _.self!==_.parent}catch(e){return!0}}()&&!function(e){return e.cookieWrite("TEST_AMCV_COOKIE","T",1),"T"===e.cookieRead("TEST_AMCV_COOKIE")&&(e._helpers.removeCookie("TEST_AMCV_COOKIE"),!0)}(o)&&_.parent?new Y(e,i,o,_.parent):new Xe(e,i,a);return o=null,l.init(),l},function(){function e(){Xe.windowLoaded=!0}_.addEventListener?_.addEventListener("load",e):_.attachEvent&&_.attachEvent("onload",e),Xe.codeLoadEnd=(new Date).getTime()}(),Xe}();// Dynamic Tag Management Library
// Property: DTM - 2.0
// All code and conventions are protected by copyright
// Adobe Systems Incorporated
(function(window, document, undefined) {
// Satellite
// =========
//
// Satellite *core*. Yeah, you want it.
//
// In this first section, we have a some useful utility functions.
var ToString = Object.prototype.toString
var Overrides = window._satellite && window._satellite.override
function assert(cond, msg){
if (!cond){
throw new Error(msg || "Assertion Failure")
}
}
var SL = {
initialized: false,
// `$data(elm, prop, [val])`
// ----------------------------
//
// Our own `$data()` method, [a la jQuery](http://api.jquery.com/jQuery.data/)
// , used to get or set
// properties on DOM elements without going insane.
// `uuid` and `dataCache` are used by `$data()`
//
// Parameters:
//
// - `elm` - the element to get or set a property to
// - `prop` - the property name
// - `val` - the value of the property, if omitted, the method will
// return the existing value of the property, if any
$data: function(elm, prop, val){
if (!elm) return;
var __satellite__ = '__satellite__'
var cache = SL.dataCache
var uuid = elm[__satellite__]
if (!uuid) uuid = elm[__satellite__] = SL.uuid++
var datas = cache[uuid]
if (!datas) datas = cache[uuid] = {}
if (val === undefined)
return datas[prop]
else
datas[prop] = val
},
uuid: 1,
dataCache: {},
// `keys(object)`
// --------------
//
// Return all keys of an object in an array.
keys: function(obj){
var ret = []
for (var key in obj)
if (obj.hasOwnProperty(key))
ret.push(key)
return ret
},
// `values(object)`
// ----------------
//
// Return all values of an object in an array.
values: function(obj){
var ret = []
for (var key in obj)
if (obj.hasOwnProperty(key))
ret.push(obj[key])
return ret
},
// `isArray(thing)`
// --------------
//
// Returns whether the given thing is an array.
isArray: Array.isArray || function(thing){
return ToString.apply(thing) === "[object Array]"
},
// `isObject(thing)`
// -----------------
//
// Returns whether the given thing is a plain object.
isObject: function(thing){
return thing != null && !SL.isArray(thing) &&
typeof thing === 'object'
},
// `isString(thing)`
// -----------------
//
// Returns whether thing is a string
isString: function(thing){
return typeof thing === 'string'
},
// `isNumber(thing)`
// -----------------
//
// Returns whether thing is a number
isNumber: function(thing){
return ToString.apply(thing) === '[object Number]' && !SL.isNaN(thing)
},
// `isNaN(thing)`
// --------------
//
// Return whether thing is NaN
isNaN: function(thing){
return thing !== thing
},
// `isRegex(thing)`
// ----------------
//
// Returns whether thing is a RegExp object
isRegex: function(thing){
return thing instanceof RegExp
},
// `isLinkTag(thing)`
// ----------------
//
// Returns whether thing is a DOM link element
isLinkTag: function(thing){
return !!(thing && thing.nodeName &&
thing.nodeName.toLowerCase() === 'a')
},
// `each(arr, func, [context])`
// ------------------
//
// A handy method for array iteration wo having to write a for-loop.
//
// Parameters:
//
// - `arr` - an array
// - `func(item, index, arr)` - a function which accepts each item in the array
// once. I takes these arguments
// * `item` - an item
// * `index` - the array index of said item
// * `arr` - the array
// - `context` - the context to be bound to `func` when it is invoked
each: function(arr, func, context){
for (var i = 0, len = arr.length; i < len; i++)
func.call(context, arr[i], i, arr)
},
// `map(arr, func)`
// ----------------
//
// A handy method for mapping an array to another array using a 1-to-1 mapping
// for each element
//
// Parameters:
//
// Parameters are the same as `SL.each`, except that `func` is expected to return
// a the value you want in the corresponding index of the returned array.
map: function(arr, func, context){
var ret = []
for (var i = 0, len = arr.length; i < len; i++)
ret.push(func.call(context, arr[i], i, arr))
return ret
},
// `filter(arr, cond)`
// -------------------
//
// Handy method for take an array and filtering down to a subset of the elements.
//
// Parameters:
//
// Parameters are the same as `SL.each` except the second argument is `cond`
// instead of `func` and it is expected to return a truthy value respresenting
// whether to include this item in the return array or not.
filter: function(arr, cond, context){
var ret = []
for (var i = 0, len = arr.length; i < len; i++){
var item = arr[i]
if (cond.call(context, item, i, arr))
ret.push(item)
}
return ret
},
// `any(arr, cond, context)`
// -------------------------
//
// Another array helper function. Returns true if `cond(item)` returns true
// for any item in the array.
any: function(arr, cond, context){
for (var i = 0, len = arr.length; i < len; i++){
var item = arr[i]
if (cond.call(context, item, i, arr))
return true
}
return false
},
// `every(arr, cond, context)`
// ---------------------------
//
// Another array helper function. Returns true if `cond(item)` returns true
// for every item in the array.
every: function(arr, cond, context){
var retval = true
for (var i = 0, len = arr.length; i < len; i++){
var item = arr[i]
retval = retval && cond.call(context, item, i, arr)
}
return retval
},
// `contains(arr, obj)`
// -----------------------
//
// Tells you whether an array contains an object.
//
// Parameters:
//
// - `arr` - said array
// - `obj` - said object
contains: function(arr, obj){
return SL.indexOf(arr, obj) !== -1
},
// `indexOf(arr, obj)`
// -------------------
//
// Return the index of an object within an array.
//
// Parameters;
//
// - `arr` - said array
// - `obj` - said object
indexOf: function(arr, obj){
if (arr.indexOf)
return arr.indexOf(obj)
for (var i = arr.length; i--;)
if (obj === arr[i])
return i
return -1
},
// `find(arr, obj)`
// -------------------
//
// Return the index of an object within an array.
//
// Parameters;
//
// - `arr` - said array
// - `obj` - said object
find: function(arr, cond, context){
var ret = []
if (!arr) return null
for (var i = 0, len = arr.length; i < len; i++){
var item = arr[i]
if (cond.call(context, item, i, arr))
return item
}
return null
},
// `textMatch(str, str_or_regex)`
// ------------------------------
//
// Perform a string match based on another string or a regex.
//
// Parameters:
//
// `str` - the input string to be matched
// `str_or_regex` - the pattern to match against, if this is a string, it requires exact match, if
// it's a regex, then it will do regex match
textMatch: function(str, pattern){
if (pattern == null) throw new Error('Illegal Argument: Pattern is not present')
if (str == null) return false
if (typeof pattern === 'string') return str === pattern
else if (pattern instanceof RegExp) return pattern.test(str)
else return false
},
// `stringify(obj, [seenValues])`
// ------------------------------
//
// Stringify any type of object.
//
// Parameters:
//
// `obj` - the object that needs to be stringified
// `seenValues` - pool of parsed resources; used to avoid circular references;
stringify: function(obj, seenValues){
seenValues = seenValues || [];
if (SL.isObject(obj)) {
if (SL.contains(seenValues, obj)) {
return '<Cycle>';
} else {
seenValues.push(obj);
}
}
if (SL.isArray(obj)) {
return '[' + SL.map(obj, function(value){
return SL.stringify(value, seenValues)
}).join(',') + ']';
} else if (SL.isString(obj)) {
return '"' + String(obj) + '"';
} if (SL.isObject(obj)) {
var data = [];
for (var prop in obj) {
if (obj.hasOwnProperty(prop))
data.push(prop + ': ' + SL.stringify(obj[prop], seenValues));
}
return '{' + data.join(', ') + '}';
} else {
return String(obj);
}
},
// `trim(str)`
// -----------
//
// Trims a string.
//
// Parameters:
//
// `str` - the input string to be trimmed.
trim: function(str){
if (str == null) return null
if (str.trim){
return str.trim()
}else{
return str.replace(/^ */, '').replace(/ *$/, '')
}
},
// `bind(func, context)`
// ---------------------
//
// Binds a context permanently to a context. The returned function is a new function
// which - when called - will call the passed in function with `context` bound to it.
//
// Parameters:
//
// `func` - a function
// `context` - an object to be bound as the context of this function
bind: function(func, context) {
return function() {
return func.apply(context, arguments)
}
},
// `throttle(fn, delay)`
// ---------------------
//
// *Throttles* a function `fn` to be called no more than once during the interval
// specified by `delay`.
//
// Parameters:
//
// - `fn` - a function
// - `delay` - delay in milliseconds
//
// *Throttle function stolen from
// <http://remysharp.com/2010/07/21/throttling-function-calls/>*
throttle: function(fn, delay) {
var timer = null;
return function () {
var context = this, args = arguments;
clearTimeout(timer);
timer = setTimeout(function () {
fn.apply(context, args);
}, delay);
};
},
// `domReady(callback)`
// --------------------
//
// Registers a callback to be called when the DOM is fully parsed and loaded.
//
// Parameters:
//
// - `callback` - a function to be called at `domready`
//
// *domReady is borrowed from <https://github.com/ded/domready>*
domReady: (function (ready) {
var fns = [], fn, f = false
, doc = document
, testEl = doc.documentElement
, hack = testEl.doScroll
, domContentLoaded = 'DOMContentLoaded'
, addEventListener = 'addEventListener'
, onreadystatechange = 'onreadystatechange'
, loaded = /^loade|^c/.test(doc.readyState)
function flush(f) {
loaded = 1
while (f = fns.shift()) f()
}
doc[addEventListener] && doc[addEventListener](domContentLoaded, fn = function () {
doc.removeEventListener(domContentLoaded, fn, f)
flush()
}, f)
hack && doc.attachEvent(onreadystatechange, (fn = function () {
if (/^c/.test(doc.readyState)) {
doc.detachEvent(onreadystatechange, fn)
flush()
}
}))
return (ready = hack ?
function (fn) {
self != top ?
loaded ? fn() : fns.push(fn) :
function () {
try {
testEl.doScroll('left')
} catch (e) {
return setTimeout(function() { ready(fn) }, 50)
}
fn()
}()
} :
function (fn) {
loaded ? fn() : fns.push(fn)
})
}()),
// `loadScript(url, [callback])`
// -----------------------------
//
// Load an external script.
//
// Parameters:
//
// - `url` - the URL of the script
// - `callback`(optional) - the function to be called after the script has loaded.
loadScript: function(url, callback){
var script = document.createElement('script')
SL.scriptOnLoad(url, script, callback)
script.src = url
document.getElementsByTagName('head')[0]
.appendChild(script)
},
scriptOnLoad: function(url, script, callback){
function cb(err){
if (err) SL.logError(err)
if (callback) callback(err)
}
if ('onload' in script){
script.onload = function(){
cb()
}
script.onerror = function(){
cb(new Error('Failed to load script ' + url))
}
}else if ('readyState' in script){
script.onreadystatechange = function(){
var rs = script.readyState
if (rs === 'loaded' || rs === 'complete'){
script.onreadystatechange = null
cb()
}
}
}
},
// `loadScriptOnce(url, [callback])`
// -----------------------------
//
// Load an external script only if it hasn't been loaded until now.
//
// Parameters:
//
// - `url` - the URL of the script
// - `callback`(optional) - the function to be called after the script has loaded.
loadScriptOnce: function(url, callback){
if (SL.loadedScriptRegistry[url]) return
SL.loadScript(url, function(err) {
if (!err) {
SL.loadedScriptRegistry[url] = true
}
if (callback) callback(err)
})
},
loadedScriptRegistry: {},
// `loadScriptSync(url)`
// -----------------------------
//
// Load an external script using document.write.
//
// Parameters:
//
// - `url` - the URL of the script
loadScriptSync: function(url){
if (!document.write) {
SL.notify('Cannot load sync the "' + url + '" script because "document.write" is not available', 1)
return
}
if (SL.domReadyFired){
SL.notify('Cannot load sync the "' + url + '" script after DOM Ready.', 1)
return
}
// If the url contains a double quote, it could be someone trying to switch out of the
// attribute to introduce an XSS hack. On the other hand, it could just be that the URL
// was never escaped. We'll escape it to prevent the former while supporting the latter.
if (url.indexOf('"') > -1) {
url = encodeURI(url);
}
document.write('<script src="' + url + '"></scr' + 'ipt>');
},
// `pushAsyncScript(callback)`
// -------------------
//
// Called by an async custom user script.
pushAsyncScript: function(cb){
SL.tools['default'].pushAsyncScript(cb)
},
// `pushBlockingScript(callback)`
// ------------------------------
//
// Called by a blocking custom user script.
pushBlockingScript: function(cb){
SL.tools['default'].pushBlockingScript(cb)
},
// `addEventHandler(elm, evt, callback)`
// -------------------------------------
//
// Register an event handler for a element
//
// Parameters:
//
// - `elm` - the element in question
// - `evt` - the event type to listen to
// - `callback` - callback function
addEventHandler: window.addEventListener ?
function(node, evt, cb){ node.addEventListener(evt, cb, false) } :
function(node, evt, cb){ node.attachEvent('on' + evt, cb) },
removeEventHandler: window.removeEventListener ?
function(node, evt, cb){ node.removeEventListener(evt, cb, false) } :
function(node, evt, cb){ node.detachEvent('on' + evt, cb) },
// `preventDefault(evt)`
// ---------------------
//
// Prevent the default browser behavior for this event
//
// Parameters:
//
// `evt` - the event triggered
preventDefault: window.addEventListener ?
function(e){ e.preventDefault() } :
function(e){ e.returnValue = false },
// `stopPropagation(evt)`
// ----------------------
//
// Cross-browser `stopPropagation`
//
// Parameters:
//
// `evt` - the event triggered
stopPropagation: function(e){
e.cancelBubble = true
if (e.stopPropagation) e.stopPropagation()
},
// `containsElement(container, elm)`
// ----------------------
//
// Given DOM elements `container` and `elm`, returns whether `container` contains `elm`.
//
// Parameters:
//
// `elm1` - the possible parent
// `elm2` - the possible child
containsElement: function(container, elm) {
return container.contains ? container.contains(elm) :
!!(container.compareDocumentPosition(elm) & 16);
},
// `matchesCss(css, elm)`
// ----------------------
//
// Returns whether a DOM element matches a given css selector
//
// Parameters:
//
// - `css` - the CSS selector
// - `elm` - the element
matchesCss: (function(docEl){
function simpleTagMatch(selector, elm){
var tagName = elm.tagName
if (!tagName) return false
return selector.toLowerCase() === tagName.toLowerCase()
}
var matches =
docEl.matchesSelector ||
docEl.mozMatchesSelector ||
docEl.webkitMatchesSelector ||
docEl.oMatchesSelector ||
docEl.msMatchesSelector
if (matches) {
return function(selector, elm){
if (elm === document || elm === window) return false
try{
return matches.call(elm, selector)
}catch(e){
return false
}
}
} else if(docEl.querySelectorAll) {
return function(selector, elm) {
var parent = elm.parentNode
if (!parent) return false
if (selector.match(/^[a-z]+$/i)){
return simpleTagMatch(selector, elm)
}
try{
var nodeList = elm.parentNode.querySelectorAll(selector)
for (var i = nodeList.length; i--;)
if (nodeList[i] === elm) return true
}catch(e){
//
}
return false
}
}else{
return function(selector, elm){
if (selector.match(/^[a-z]+$/i)){
return simpleTagMatch(selector, elm)
}
try{
return SL.Sizzle.matches(selector, [elm]).length > 0
}catch(e){
return false
}
}
}
}(document.documentElement)),
// `cssQuery(css)`
// ---------------
//
// Return a list of element matching the given css selector
//
// Parameters:
//
// - `css` - the CSS selector
cssQuery: (function(doc){
if (doc.querySelectorAll) {
return function(css, cb){
var results
try{
results = doc.querySelectorAll(css)
}catch(e){
results = []
}
cb(results)
}
}else{
return function(css, cb){
if (SL.Sizzle){
var results
try{
results = SL.Sizzle(css)
}catch(e){
results = []
}
cb(results)
}else
SL.sizzleQueue.push([css, cb])
}
}
})(document),
// `hasAttr(elem, attrName)`
// ---------------
//
// Check if attribute is defined on element
//
// Parameters:
//
// - `elem` - the DOM element
// - `attrName` - attribute name
hasAttr: function(elem, attrName) {
return elem.hasAttribute ? elem.hasAttribute(attrName) : elem[attrName] !== undefined;
},
// `inherit(subClass, superClass)`
// -------------------------------
//
// Make `subClass` inherit `superClass`.
//
// Parameters:
//
// - `subClass` - a Javascript function representing a constructor - the inheritor
// - `superClass` - another constructor - the one to inherit from
inherit: function(subClass, superClass){
var f = function() {}
f.prototype = superClass.prototype
subClass.prototype = new f()
subClass.prototype.constructor = subClass
},
// `extend(dst, src)`
// ----------------
//
// Extend an object with the properties of another.
//
// Parameters:
//
// - `dst` - object to copy to
// - `src` - object to copy from
extend: function(dst, src){
for (var prop in src)
if (src.hasOwnProperty(prop))
dst[prop] = src[prop]
},
// `toArray(arrayLike)`
// --------------------
//
// Converts an array-like object to an array.
//
// Parameters:
//
// - `arrayLike` - an array-like object, meaning it has a length property
// which is a number
toArray: (function(){
try {
var slice = Array.prototype.slice
slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
return function(thing){
return slice.call(thing, 0)
}
// Provide a fallback method if it does not work
} catch( e ) {
return function(thing){
var ret = []
for (var i = 0, len = thing.length; i < len; i++)
ret.push(thing[i])
return ret
}
}
})(),
// `equalsIgnoreCase(str1, str2)`
// ------------------------------
//
// Returns true iff str1 and str2 are equal ignoring case.
//
// Parameters:
//
// * `str1` - the first string
// * `str2` - the second string
equalsIgnoreCase: function(str1, str2){
if (str1 == null) return str2 == null
if (str2 == null) return false
return String(str1).toLowerCase() === String(str2).toLowerCase()
},
// `poll(fn, [freq], [max_retries])`
// ------------------
//
// Runs `fn` for every `freq` ms. `freq` defaults to 1000. If any
// invocation of `fn()` returns true, polling will stop.
// The polling will stop if the number or retries exceeds the
// provided `max_retries`.
//
// Parameters:
//
// * `fn` - function to be called repeatedly
// * `freq` - frequency to call the function
// * `max_retries` - number of times to retry
poll: function(fn, freq, max_retries){
var retries = 0
freq = freq || 1000
check()
function check(){
if (SL.isNumber(max_retries) && retries++ >= max_retries) {
return;
}
if (!fn()){
setTimeout(check, freq)
}
}
},
// ``Html(str)`
// --------------------
//
// Escapes a string for being used in an HTML context. Returns
// the escaped version of the string. Replaces the characters
// `&` `<` `>` `"` `'` and `/`.
//
// Parameters:
//
// * `str` - the string to be escaped
escapeForHtml: function(str){
if (!str) return str
return String(str)
.replace(/\&/g, '&amp;')
.replace(/\</g, '&lt;')
.replace(/\>/g, '&gt;')
.replace(/\"/g, '&quot;')
.replace(/\'/g, '&#x27;')
.replace(/\//g, '&#x2F;')
}
}
// The available tools to use.
SL.availableTools = {}
// The avaliable event emitters to use.
SL.availableEventEmitters = []
// The names of the events which can only fire once.
SL.fireOnceEvents = ['condition', 'elementexists']
// Initialize all event emitters.
SL.initEventEmitters = function(){
SL.eventEmitters = SL.map(SL.availableEventEmitters, function(ee){
return new ee()
})
}
// Call `registerElements` on all event emitters.
SL.eventEmitterBackgroundTasks = function(){
SL.each(SL.eventEmitters, function(ee){
if ('backgroundTasks' in ee)
ee.backgroundTasks()
})
}
// Initialize all tools.
SL.initTools = function(toolSpecs){
var tools = { 'default': new DefaultTool() }
var euCookieName = SL.settings.euCookieName || 'sat_track'
for (var id in toolSpecs){
if(toolSpecs.hasOwnProperty(id)) {
var toolSpec, ctr, tool
toolSpec = toolSpecs[id]
if (toolSpec.euCookie){
var cookieSet = SL.readCookie(euCookieName) !== 'true'
if (cookieSet) continue
}
ctr = SL.availableTools[toolSpec.engine]
if (!ctr){
var available = []
for (var key in SL.availableTools){
if (SL.availableTools.hasOwnProperty(key)) {
available.push(key)
}
}
throw new Error('No tool engine named ' + toolSpec.engine +
', available: ' + available.join(',') + '.')
}
tool = new ctr(toolSpec)
tool.id = id
tools[id] = tool
}
}
return tools
}
// Pre-process arguments (variable substitutions and lower-casing) before
// feeding them to the tools.
SL.preprocessArguments = function(args, elm, evt, forceLowerCase, escapeHtml){
if (!args) return args
return preprocessArray(args, forceLowerCase)
function forceLowerCaseIfNeeded(value) {
return forceLowerCase && SL.isString(value) ? value.toLowerCase() : value
}
function preprocessObject(obj){
var ret = {}
for (var key in obj){
if (obj.hasOwnProperty(key)){
var value = obj[key]
if (SL.isObject(value)){
ret[key] = preprocessObject(value)
}else if (SL.isArray(value)){
ret[key] = preprocessArray(value, forceLowerCase)
}else{
ret[key] = forceLowerCaseIfNeeded(SL.replace(value, elm, evt, escapeHtml))
}
}
}
return ret
}
function preprocessArray(args, forceLowerCase){
var ret = []
for (var i = 0, len = args.length; i < len; i++){
var value = args[i]
if (SL.isString(value)){
value = forceLowerCaseIfNeeded(SL.replace(value, elm, evt))
}else if (value && value.constructor === Object){
value = preprocessObject(value)
}
ret.push(value)
}
return ret
}
}
// Execute a command.
SL.execute = function(trig, elm, evt, tools){
if (_satellite.settings.hideActivity) return
tools = tools || SL.tools
function doit(toolName){
var tool = tools[toolName || 'default']
if (!tool)
return
try{
tool.triggerCommand(trig, elm, evt)
}catch(e){
SL.logError(e)
}
}
if (trig.engine){
var engine = trig.engine
for (var toolName in tools){
if (tools.hasOwnProperty(toolName)) {
var tool = tools[toolName]
if (tool.settings && tool.settings.engine === engine)
doit(toolName)
}
}
}else if (trig.tool instanceof Array)
SL.each(trig.tool, function(toolName){
doit(toolName)
})
else
doit(trig.tool)
}
// Wrapper object that handles Satellite internal logging.
//
// It saves all messages for future reference (up to `keepLimit`, default 100) and
// outputs to browser's console if `_satellite.settings.notifications` is `true`.
// -----------------------------------------------------
SL.Logger = {
outputEnabled: false,
messages: [],
keepLimit: 100,
flushed: false,
// @fixme: remove first 2 items when legacy code is updated
LEVELS: [null, null, 'log', 'info', 'warn', 'error'],
// `lvl` should be the index of a level defined in `LEVELS`
message: function(msg, lvl) {
var level = this.LEVELS[lvl] || 'log';
this.messages.push([level, msg]);
if (this.messages.length > this.keepLimit) {
this.messages.shift();
}
if (this.outputEnabled) {
this.echo(level, msg)
}
},
getHistory: function() {
return this.messages;
},
clearHistory: function() {
this.messages = [];
},
setOutputState: function(state) {
if (this.outputEnabled == state) return;
this.outputEnabled = state;
if (state) {
this.flush();
} else {
this.flushed = false;
}
},
// Private
// ----------------------------------------
echo: function(func, msg) {
if (!window.console) return;
window.console[func]("SATELLITE: " + msg);
},
flush: function() {
if (this.flushed) return;
SL.each(this.messages, function(item) {
if (item[2] === true) return; // message already flushed
this.echo(item[0], item[1]);
item[2] = true;
}, this);
this.flushed = true;
}
};
// `notify(msg, pty)`
// ------------------
//
// Notify the user of things happening in Satellite using `console.log`
//
// - msg - message to print
// - pty - priority
SL.notify = SL.bind(SL.Logger.message, SL.Logger);
// `cleanText(str)`
// ================
//
// "Cleans" the text from an element's innerText. This is used directly by the
// @cleanText special property.
SL.cleanText = function(str){
if (str == null) return null
return SL.trim(str).replace(/\s+/g, ' ')
}
SL.cleanText.legacy = function(str){
if (str == null) return null
return SL.trim(str).replace(/\s{2,}/g, ' ')
.replace(/[^\000-\177]*/g, '')
}
SL.text = function(obj){
return obj.textContent || obj.innerText
}
// Special Properties for DOM elements. You use special properties using
// the @ prefix. Example:
//
// this.@text
SL.specialProperties = {
text: SL.text,
cleanText: function(obj){
return SL.cleanText(SL.text(obj))
}
}
// `getObjectProperty(obj, property)`
// ============================
//
// Get property(potentially nested) from an object.
SL.getObjectProperty = function(obj, property, supportSpecial){
var propChain = property.split('.')
var currValue = obj
var special = SL.specialProperties
var attrMatch
for (var i = 0, len = propChain.length; i < len; i++){
if (currValue == null) return undefined
var prop = propChain[i]
if (supportSpecial && prop.charAt(0) === '@'){
var specialProp = prop.slice(1)
currValue = special[specialProp](currValue)
continue
}
if (currValue.getAttribute &&
(attrMatch = prop.match(/^getAttribute\((.+)\)$/))){
var attr = attrMatch[1]
currValue = currValue.getAttribute(attr)
continue
}
currValue = currValue[prop]
}
return currValue
}
// `getToolsByType(type)`
// ------------------------------------------------
//
// Returns an array containing all the tools whose engine property match
// the provided type.
//
// - `type` - The searched tool type
SL.getToolsByType = function(type){
if (!type) {
throw new Error('Tool type is missing')
}
var result = []
for (var t in SL.tools) {
if (SL.tools.hasOwnProperty(t)) {
var tool = SL.tools[t]
if (tool.settings && tool.settings.engine === type) {
result.push(tool)
}
}
}
return result
}
// `setVar(name, value)` or `setVar(mapping)`
// ==========================================
//
// Set a customer variable. Can be either called like this
//
// _satellite.setVar('name', 'value')
//
// Or by passing in a mapping(object literall) which allows setting multiple variables at
// the same time.
//
// _satellite.setVar({name: 'value', foo: 'bar'})
SL.setVar = function(){
var customVars = SL.data.customVars
if(customVars == null) SL.data.customVars = {}, customVars = SL.data.customVars
if (typeof arguments[0] === 'string'){
var prop = arguments[0]
customVars[prop] = arguments[1]
}else if (arguments[0]){ // assume an object literal
var mapping = arguments[0]
for (var key in mapping)
if (mapping.hasOwnProperty(key))
customVars[key] = mapping[key]
}
}
SL.dataElementSafe = function(key, length){
if (arguments.length > 2){
// setter
var value = arguments[2]
if (length === 'pageview'){
SL.dataElementSafe.pageviewCache[key] = value
}else if (length === 'session'){
SL.setCookie('_sdsat_' + key, value)
}else if (length === 'visitor') {
SL.setCookie('_sdsat_' + key, value, 365 * 2)
}
}else{
// getter
if (length === 'pageview'){
return SL.dataElementSafe.pageviewCache[key]
}else if (length === 'session' || length === 'visitor'){
return SL.readCookie('_sdsat_' + key)
}
}
}
SL.dataElementSafe.pageviewCache = {}
SL.realGetDataElement = function(dataDef){
var ret
if (dataDef.selector) {
if (SL.hasSelector) {
SL.cssQuery(dataDef.selector, function(elms) {
if (elms.length > 0) {
var elm = elms[0]
if (dataDef.property === 'text') {
ret = elm.innerText || elm.textContent
}else if (dataDef.property in elm){
ret = elm[dataDef.property]
}else if (SL.hasAttr(elm, dataDef.property)){
ret = elm.getAttribute(dataDef.property)
}
}
})
}
}else if (dataDef.queryParam) {
if (dataDef.ignoreCase){
ret = SL.getQueryParamCaseInsensitive(dataDef.queryParam)
}else{
ret = SL.getQueryParam(dataDef.queryParam)
}
}else if (dataDef.cookie) {
ret = SL.readCookie(dataDef.cookie)
}else if (dataDef.jsVariable) {
ret = SL.getObjectProperty(window, dataDef.jsVariable)
}else if (dataDef.customJS) {
ret = dataDef.customJS()
}else if (dataDef.contextHub) {
ret = dataDef.contextHub()
}
if (SL.isString(ret) && dataDef.cleanText){
ret = SL.cleanText(ret)
}
return ret
}
SL.getDataElement = function(variable, suppressDefault, dataDef) {
dataDef = dataDef || SL.dataElements[variable]
if (dataDef == null) {
return SL.settings.undefinedVarsReturnEmpty ? '' : null;
}
var ret = SL.realGetDataElement(dataDef)
if (ret === undefined && dataDef.storeLength) {
ret = SL.dataElementSafe(variable, dataDef.storeLength)
}else if (ret !== undefined && dataDef.storeLength) {
SL.dataElementSafe(variable, dataDef.storeLength, ret)
}
if (!ret && !suppressDefault) {
ret = dataDef['default'] || ''
}
if (SL.isString(ret) && dataDef.forceLowerCase) {
ret = ret.toLowerCase()
}
return ret
}
// getVar(variable, elm, evt)
// ==========================
//
// Return the value of a variable, where the variable
// can be a data element, defined in the "data" section
// of the initial settings, or reference properties on
// an element, event, or target of the event in question,
// a query parameter, or a random number.
//
// - `variable` - the name of the variable to get
// - `[elm]` - the associated element, if any
// - `[evt]` - the associated event, if any
SL.getVar = function(variable, elm, evt){
var custVars = SL.data.customVars
, target = evt ? (evt.target || evt.srcElement) : null
, randMatch
, value
var map = {
uri: SL.URI(),
protocol: document.location.protocol,
hostname: document.location.hostname
}
if (SL.dataElements && variable in SL.dataElements){
return SL.getDataElement(variable)
}
value = map[variable.toLowerCase()]
if (value === undefined){
if (variable.substring(0, 5) === 'this.'){
variable = variable.slice(5)
value = SL.getObjectProperty(elm, variable, true)
}else if(variable.substring(0, 6) === 'event.'){
variable = variable.slice(6)
value = SL.getObjectProperty(evt, variable)
}else if(variable.substring(0, 7) === 'target.'){
variable = variable.slice(7)
value = SL.getObjectProperty(target, variable)
}else if(variable.substring(0, 7) === 'window.'){
variable = variable.slice(7)
value = SL.getObjectProperty(window, variable)
}else if (variable.substring(0, 6) === 'param.'){
variable = variable.slice(6)
value = SL.getQueryParam(variable)
}else if(randMatch = variable.match(/^rand([0-9]+)$/)){
var len = Number(randMatch[1])
, s = (Math.random() * (Math.pow(10, len) - 1)).toFixed(0)
value = Array(len - s.length + 1).join('0') + s
}else{
value = SL.getObjectProperty(custVars, variable)
}
}
return value
}
SL.getVars = function(variables, elm, evt){
var ret = {}
SL.each(variables, function(variable){
ret[variable] = SL.getVar(variable, elm, evt)
})
return ret
}
// `replace(str, [elm], [target])`
// ---------------------
//
// Perform variable subtitutions substitute to a string where subtitions are
// specified in the form `"%foo%"`. Variables are lookup either in `SL.data.customVars`, or
// if the `elm` parameter is passed it, and the variable spec is of the form `"%this.tagName%"`, it
// is subsituted with the properties on `elm`, *i.e. `elm.tagName`.
//
// Parameters:
//
// - `str` - string to apply substitutions to
// - `elm`(optional) - object or element to use for substitutions of the form `%this.property%`
// - `target`(optional) - element to use for subsitution of the form `%target.property%`
// - `escapeHtml` (optional) - whether or not to escape substitutions for embedding in HTML
SL.replace = function(str, elm, evt, escapeHtml) {
if (typeof str !== 'string') return str
return str
.replace(/%(.*?)%/g, function(m, variable){
var val = SL.getVar(variable, elm, evt)
if (val == null) {
return SL.settings.undefinedVarsReturnEmpty ? '' : m;
} else {
if (escapeHtml) {
return SL.escapeForHtml(val);
} else {
return val;
}
}
});
}
SL.escapeHtmlParams = function(fn){
fn.escapeHtml = true
return fn
}
// From a object literal of variable, generate a query string.
SL.searchVariables = function(vars, elm, evt){
if (!vars || vars.length === 0) return ''
var qsParts = []
for (var i = 0, len = vars.length; i < len; i++){
var varr = vars[i]
, value = SL.getVar(varr, elm, evt)
qsParts.push(varr + '=' + escape(value))
}
return '?' + qsParts.join('&')
}
// Fire all the trigger actions associated with a rule.
SL.fireRule = function(rule, elm, evt){
var triggers = rule.trigger
if (!triggers) return
for (var i = 0, len = triggers.length; i < len; i++){
var trig = triggers[i]
SL.execute(trig, elm, evt)
}
if (SL.contains(SL.fireOnceEvents, rule.event))
rule.expired = true
}
// `isLinked(elm)`
// ---------------
//
// Returns whether the element is either an anchor or a descendant of an anchor or contains an anchor.
//
// `elm` - the element to test
SL.isLinked = function(elm){
for (var cur = elm; cur; cur = cur.parentNode) {
if (SL.isLinkTag(cur))
return true
}
return false
}
// Fire a page load event. `type` is one of `pagetop`, `pagebottom`, `domready` and
// `windowload`.
SL.firePageLoadEvent = function(type) {
var location = document.location
var evt = {type: type, target: location}
var rules = SL.pageLoadRules
var handlers = SL.evtHandlers[evt.type];
for (var i = rules.length; i--;){
var rule = rules[i]
if (SL.ruleMatches(rule, evt, location)){
SL.notify('Rule "' + rule.name + '" fired.', 1)
SL.fireRule(rule, location, evt)
}
}
for (var id in SL.tools){
if (SL.tools.hasOwnProperty(id)) {
var tool = SL.tools[id]
if (tool.endPLPhase) {
tool.endPLPhase(type)
}
}
}
if (handlers){
SL.each(handlers, function(cb){
cb(evt)
})
}
}
// `track(id)`
// -----------
//
// Directly fire a direct call rule by id.
SL.track = function(ruleName) {
// trim extra spaces that may exist at beginning or end of string
ruleName = ruleName.replace(/^\s*/,"").replace(/\s*$/,"")
for (var i = 0; i < SL.directCallRules.length; i++){
var rule = SL.directCallRules[i]
if (rule.name === ruleName){
SL.notify('Direct call Rule "' + ruleName + '" fired.', 1)
SL.fireRule(rule, location, {type: ruleName})
return
}
}
SL.notify('Direct call Rule "' + ruleName + '" not found.', 1)
}
// `basePath()`
// ------------
//
// Returns the base path of all Satellite generated assets.
SL.basePath = function(){
if (SL.data.host)
return (document.location.protocol === 'https:' ?
'https://' + SL.data.host.https :
'http://' + SL.data.host.http) + '/'
else
return this.settings.basePath
}
// `setLocation(url)`
// ------------------
//
// Set the current URL
//
// - `url` - the URL to set to
SL.setLocation = function(url){
window.location = url
}
SL.parseQueryParams = function(str){
var URIDecode = function (str) {
var result = str
try {
result = decodeURIComponent(str)
} catch(err) {}
return result
}
if (str === '' || SL.isString(str) === false) return {}
if (str.indexOf('?') === 0) {
str = str.substring(1)
}
var ret = {}
, pairs = str.split('&')
SL.each(pairs, function(pair){
pair = pair.split('=')
if (!pair[1]) {
return
}
ret[URIDecode(pair[0])] = URIDecode(pair[1])
})
return ret
}
SL.getCaseSensitivityQueryParamsMap = function (str) {
var normal = SL.parseQueryParams(str)
var insensitive = {}
for (var prop in normal)
if (normal.hasOwnProperty(prop))
insensitive[prop.toLowerCase()] = normal[prop]
return {
normal: normal,
caseInsensitive: insensitive
}
}
SL.updateQueryParams = function(){
SL.QueryParams = SL.getCaseSensitivityQueryParamsMap(window.location.search)
}
SL.updateQueryParams()
SL.getQueryParam = function(key){
return SL.QueryParams.normal[key]
}
SL.getQueryParamCaseInsensitive = function(key){
return SL.QueryParams.caseInsensitive[key.toLowerCase()]
}
SL.encodeObjectToURI = function(obj) {
if (SL.isObject(obj) === false) {
return ''
}
var uri = []
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
uri.push(encodeURIComponent(key) + '=' + encodeURIComponent(obj[key]))
}
}
return uri.join('&')
}
SL.readCookie = function(name) {
var nameEQ = name + "="
var parts = document.cookie.split(';')
for(var i=0;i < parts.length;i++) {
var c = parts[i]
while (c.charAt(0)==' '){
c = c.substring(1,c.length)
}
if (c.indexOf(nameEQ) === 0){
return c.substring(nameEQ.length,c.length)
}
}
return undefined
}
SL.setCookie = function(name,value,days) {
var expires
if (days) {
var date = new Date()
date.setTime(date.getTime()+(days*24*60*60*1000))
expires = "; expires="+date.toGMTString()
}
else{
expires = ""
}
document.cookie = name+"="+value+expires+"; path=/"
}
SL.removeCookie = function(name) {
SL.setCookie(name,"",-1);
}
SL.getElementProperty = function(elm, prop){
if (prop.charAt(0) === '@'){
var special = SL.specialProperties[prop.substring(1)]
if (special){
return special(elm)
}
}
if (prop === 'innerText'){
return SL.text(elm)
}
if (prop in elm)
return elm[prop]
return elm.getAttribute ? elm.getAttribute(prop) : undefined
}
SL.propertiesMatch = function(property, elm){
if (property){
for (var prop in property){
if (property.hasOwnProperty(prop)) {
var target = property[prop]
var value = SL.getElementProperty(elm, prop)
if (typeof target === 'string' && target !== value) return false
if (target instanceof RegExp && !target.test(value)) return false
}
}
}
return true
}
// from http://www.quirksmode.org/js/events_properties.html
SL.isRightClick = function(e){
var ret
if (e.which){
ret = e.which == 3
}else if (e.button){
ret = e.button == 2
}
return ret
}
// `ruleMatches(rule, evt, elm, eventEntriesFound)`
// ------------------------------------------------
//
// - `rule` - the rules to match
// - `evt` - the event triggered
// - `elm` - the element the event was on
// - `eventEntriesFound` - number of rules matched so far
SL.ruleMatches = function(rule, evt, elm, eventEntriesFound){
var cnd = rule.condition
var cnds = rule.conditions
var property = rule.property
var eventType = evt.type
var matchValue = rule.value
var target = evt.target || evt.srcElement
var initialTarget = elm === target
if (rule.event !== eventType && (rule.event !== 'custom' || rule.customEvent !== eventType)) return false
if (!SL.ruleInScope(rule)) return false
// ignore all right-clicks
if (rule.event === 'click' && SL.isRightClick(evt)){
return false
}
if (rule.isDefault && eventEntriesFound > 0)
return false
if (rule.expired) return false
if (eventType === 'inview' && evt.inviewDelay !== rule.inviewDelay){
return false
}
if (!(initialTarget ||
((rule.bubbleFireIfParent !== false) && (eventEntriesFound === 0 || (rule.bubbleFireIfChildFired !== false))))) return false
if (rule.selector && !SL.matchesCss(rule.selector, elm)) return false
if (!SL.propertiesMatch(property, elm)) return false
if (matchValue != null){
if (typeof matchValue === 'string'){
if (matchValue !== elm.value)
return false
}else if (!matchValue.test(elm.value))
return false
}
if (cnd){
try{
if (!cnd.call(elm, evt, target)){
SL.notify('Condition for rule "' + rule.name + '" not met.', 1)
return false
}
}catch(e){
SL.notify('Condition for rule "' + rule.name + '" not met. Error: ' + e.message, 1)
return false
}
}
if (cnds){
var failed = SL.find(cnds, function(cnd){
try{
return !cnd.call(elm, evt, target)
}catch(e){
SL.notify('Condition for rule "' + rule.name + '" not met. Error: ' + e.message, 1)
return true
}
})
if (failed){
SL.notify('Condition ' + failed.toString() + ' for rule "' + rule.name + '" not met.', 1)
return false
}
}
return true
}
SL.evtHandlers = {}
// `bindEvent(evtName, callback)`
// ------------------------------
//
// Register for an event by name. Alias: `whenEvent`.
//
// `evtName` - the name of the event
// `callback` - the function to be called when even fires
SL.bindEvent = function(evtName, callback){
var handlers = SL.evtHandlers
if (!handlers[evtName])
handlers[evtName] = []
handlers[evtName].push(callback)
}
SL.whenEvent = SL.bindEvent
// `unbindEvent(evtName, callback)
// -------------------------------
//
// Unregister for an event by name.
//
// `evtName` - the name of the event
// `callback` - the function to unregister
SL.unbindEvent = function(evtName, callback){
var handlers = SL.evtHandlers
if (!handlers[evtName]) return
var idx = SL.indexOf(handlers[evtName], callback)
handlers[evtName].splice(idx, 1)
}
SL.bindEventOnce = function(evtName, callback){
var wrapped = function(){
SL.unbindEvent(evtName, wrapped)
callback.apply(null, arguments)
}
SL.bindEvent(evtName, wrapped)
}
// See <http://tobyho.com/2014/02/26/attribute-only-valid-on-v-image/>
SL.isVMLPoisoned = function(elm){
if (!elm) return false
try{
elm.nodeName
}catch(e){
if (e.message === 'Attribute only valid on v:image'){
return true
}
}
return false
}
SL.handleEvent = function(evt) {
// Don't process an event twice.
if (SL.$data(evt, 'eventProcessed')) return
var eventType = evt.type.toLowerCase()
, target = evt.target || evt.srcElement
, rulesMatched = 0
, rules = SL.rules
, tools = SL.tools
, handlers = SL.evtHandlers[evt.type]
if (SL.isVMLPoisoned(target)){
SL.notify('detected ' + eventType + ' on poisoned VML element, skipping.', 1)
return
}
if (handlers){
SL.each(handlers, function(cb){
cb(evt)
})
}
var nodeName = target && target.nodeName;
if (nodeName)
SL.notify("detected " + eventType + " on " + target.nodeName, 1)
else
SL.notify("detected " + eventType, 1)
for (var curr = target; curr; curr = curr.parentNode) {
var bubbleStop = false
SL.each(rules, function(rule){
if (SL.ruleMatches(rule, evt, curr, rulesMatched)){
SL.notify('Rule "' + rule.name + '" fired.', 1)
SL.fireRule(rule, curr, evt)
rulesMatched++
if (rule.bubbleStop)
bubbleStop = true
}
})
if (bubbleStop) break
}
SL.$data(evt, 'eventProcessed', true)
}
// `onEvent(evt)`
// ------------
//
// Handle an event, whether it is a DOM event or a synthetic event.
//
// - `evt` - the event triggered
SL.onEvent = document.querySelectorAll ?
function(evt){ SL.handleEvent(evt) } :
(function(){
var q = []
var onEvent = function(evt) {
if (evt.selector)
q.push(evt)
else
SL.handleEvent(evt)
}
onEvent.pendingEvents = q
return onEvent
})()
// `fireEvent(eventType, eventTarget)`
// ------------
//
// Conviniently programmatically fire an event.
//
// - `eventType` - the type of event
// - `eventTarget` - the target object that fired the event
SL.fireEvent = function(type, target){
SL.onEvent({type: type, target: target})
}
// `registerEvents(elm, events)`
// -----------------------------
//
// Register events for an element using `track` as the callback
//
// - `elm` - the element to listen for events on
// - `events` - an array of event types (strings)
SL.registerEvents = function(elm, events){
for (var i = events.length - 1; i >= 0; i--){
var event = events[i]
if (!SL.$data(elm, event + '.tracked')){
SL.addEventHandler(elm, event, SL.onEvent)
SL.$data(elm, event + '.tracked', true)
}
}
}
// `registerEventsForTags(tags, events)`
// -------------------------------------
//
// Register events for all element that have the specified tags
//
// - `tags` - an array of tags to match for (strings)
// - `events` - an array of event types (strings)
SL.registerEventsForTags = function(tags, events){
for (var i = tags.length - 1; i >= 0; i--){
var tag = tags[i]
var elms = document.getElementsByTagName(tag);
for (var j = elms.length - 1; j >= 0; j--)
SL.registerEvents(elms[j], events)
}
}
// `setListeners()`
// ----------------
//
// Set events for `document`
SL.setListeners = function() {
var events = ['click', 'submit'];
SL.each(SL.rules, function(rule) {
if (rule.event === 'custom' &&
rule.hasOwnProperty('customEvent') &&
!SL.contains(events, rule.customEvent)) {
events.push(rule.customEvent);
}
});
SL.registerEvents(document, events);
};
// `getUniqueRuleEvents()`
// -----------------------
//
// Returns an array of unique event types for which event-based rules
// have been configured.
SL.getUniqueRuleEvents = function() {
if (!SL._uniqueRuleEvents) {
SL._uniqueRuleEvents = [];
SL.each(SL.rules, function(rule) {
if (SL.indexOf(SL._uniqueRuleEvents, rule.event) === -1) {
SL._uniqueRuleEvents.push(rule.event);
}
});
}
return SL._uniqueRuleEvents;
};
// `setFormListeners()`
// --------------------
//
// Listen for events on form elements. Listeners for these events are added directly to form
// elements since they don't bubble (though some do in modern browsers).
SL.setFormListeners = function() {
if (!SL._relevantFormEvents) {
var formEvents = [
"change",
"focus",
"blur",
// Why do we add event listeners directly to form elements for the keypress event? The
// keypress event bubbles so we could add it directly to document. Note that keypress
// events can be triggered when any element has focus which means that by adding the event
// listener directly to form elements we're filtering any keypress events from other elements.
// Is this the intention? If so, we could still add a single listener directly to document
// and filter on event.target.nodeName.
"keypress"
];
SL._relevantFormEvents = SL.filter(SL.getUniqueRuleEvents(), function(event) {
return SL.indexOf(formEvents, event) !== -1;
});
}
if (SL._relevantFormEvents.length) {
SL.registerEventsForTags(['input', 'select', 'textarea', 'button'], SL._relevantFormEvents);
}
};
// `setVideoListeners()`
// ---------------------
//
// Listen for events on video elements. Listeners for these events are added directly to form
// elements since they don't bubble.
SL.setVideoListeners = function() {
if (!SL._relevantVideoEvents) {
var videoEvents = [
"play",
"pause",
"ended",
"volumechange",
"stalled",
"loadeddata"
];
SL._relevantVideoEvents = SL.filter(SL.getUniqueRuleEvents(), function(event) {
return SL.indexOf(videoEvents, event) !== -1;
});
}
if (SL._relevantVideoEvents.length) {
SL.registerEventsForTags(['video'], SL._relevantVideoEvents);
}
};
// `readStoredSetting(name)`
// ==================
//
// Reads the cookie of the given name.
// Stolen from <http://www.quirksmode.org/js/cookies.html>
SL.readStoredSetting = function(name) {
// When local storage is disabled on Safari, the mere act of referencing window.localStorage
// throws an error. For this reason, referencing window.localStorage without being inside
// a try-catch should be avoided.
try{
name = 'sdsat_' + name
return window.localStorage.getItem(name)
}catch(e){
SL.notify('Cannot read stored setting from localStorage: ' + e.message, 2)
return null
}
}
// Read satelliteUtilsCookie values to see about getting bookmarklet running / settings
SL.loadStoredSettings = function () {
var debug = SL.readStoredSetting('debug')
, hideActivity = SL.readStoredSetting('hide_activity')
if (debug)
SL.settings.notifications = debug === 'true'
if (hideActivity)
SL.settings.hideActivity = hideActivity === 'true'
}
SL.isRuleActive = function(rule, date){
var schd = rule.schedule
if (!schd) return true
var utc = schd.utc
, getDate = utc ? 'getUTCDate' : 'getDate'
, getDay = utc ? 'getUTCDay' : 'getDay'
, getFullYear = utc ? 'getUTCFullYear' : 'getFullYear'
, getMonth = utc ? 'getUTCMonth' : 'getMonth'
, getHours = utc ? 'getUTCHours' : 'getHours'
, getMinutes = utc ? 'getUTCMinutes' : 'getMinutes'
, setHours = utc ? 'setUTCHours' : 'setHours'
, setMinutes = utc ? 'setUTCMinutes' : 'setMinutes'
, setDate = utc ? 'setUTCDate' : 'setDate'
date = date || new Date()
function dayDiff(one, other){
other = modifyDate(other, {
hour: one[getHours](),
minute: one[getMinutes]()
})
return Math.floor(Math.abs((one.getTime() - other.getTime()) / (1000 * 60 * 60 * 24)))
}
function monthDiff(one, other){
function months(date){
return date[getFullYear]() * 12 + date[getMonth]()
}
return Math.abs(months(one) - months(other))
}
function modifyDate(date, fields){
var retval = new Date(date.getTime())
for (var field in fields){
if (fields.hasOwnProperty(field)) {
var val = fields[field]
switch(field){
case 'hour':
retval[setHours](val)
break
case 'minute':
retval[setMinutes](val)
break
case 'date':
retval[setDate](val)
break
}
}
}
return retval
}
function timeGreaterThan(one, other){
var h1 = one[getHours]()
, m1 = one[getMinutes]()
, h2 = other[getHours]()
, m2 = other[getMinutes]()
return (h1 * 60 + m1) > (h2 * 60 + m2)
}
function timeLessThan(one, other){
var h1 = one[getHours]()
, m1 = one[getMinutes]()
, h2 = other[getHours]()
, m2 = other[getMinutes]()
return (h1 * 60 + m1) < (h2 * 60 + m2)
}
if (schd.repeat){
if (timeGreaterThan(schd.start, date)) return false
if (timeLessThan(schd.end, date)) return false
if (date < schd.start) return false
if (schd.endRepeat && date >= schd.endRepeat) return false
if (schd.repeat === 'daily'){
if (schd.repeatEvery){
var dd = dayDiff(schd.start, date)
if (dd % schd.repeatEvery !== 0) return false
}
}else if (schd.repeat === 'weekly'){
if (schd.days){
if (!SL.contains(schd.days, date[getDay]())) return false
}else
if (schd.start[getDay]() !== date[getDay]()) return false
if (schd.repeatEvery){
var diff = dayDiff(schd.start, date)
if (diff % (7 * schd.repeatEvery) !== 0)
return false
}
}else if (schd.repeat === 'monthly'){
if (schd.repeatEvery){
var md = monthDiff(schd.start, date)
if (md % schd.repeatEvery !== 0) return false
}
if (schd.nthWeek && schd.mthDay){
if (schd.mthDay !== date[getDay]()) return false
var nthWeek = Math.floor((date[getDate]() - date[getDay]() + 1) / 7)
if (schd.nthWeek !== nthWeek) return false
}else
if (schd.start[getDate]() !== date[getDate]()) return false
}else if (schd.repeat === 'yearly'){
if (schd.start[getMonth]() !== date[getMonth]()) return false
if (schd.start[getDate]() !== date[getDate]()) return false
if (schd.repeatEvery){
var diff = Math.abs(schd.start[getFullYear]() - date[getFullYear]())
if (diff % schd.repeatEvery !== 0) return false
}
}
}else{
if (schd.start > date) return false
if (schd.end < date) return false
}
return true
}
SL.isOutboundLink = function(elm){
if (!elm.getAttribute('href')) return false
var hostname = elm.hostname
var href = elm.href
var protocol = elm.protocol
if (protocol !== 'http:' && protocol !== 'https:') return false
var isMyDomain = SL.any(SL.settings.domainList, function(domain){
return SL.isSubdomainOf(hostname, domain)
})
if (isMyDomain) return false
return hostname !== location.hostname
}
SL.isLinkerLink = function(elm){
if (!elm.getAttribute || !elm.getAttribute('href')) return false
return SL.hasMultipleDomains() &&
elm.hostname != location.hostname &&
!elm.href.match(/^javascript/i) &&
!SL.isOutboundLink(elm)
}
SL.isSubdomainOf = function(sub, root){
if (sub === root) return true
var idx = sub.length - root.length
if (idx > 0)
return SL.equalsIgnoreCase(sub.substring(idx), root)
return false
}
// `getVisitorId()`
// ------------------------------------------------
//
// Returns the library instance associated to a VisitorId tool if the tool exists
//
SL.getVisitorId = function(){
var visitorIdTools = SL.getToolsByType('visitor_id')
if (visitorIdTools.length === 0) {
return null;
}
return visitorIdTools[0].getInstance()
}
SL.URI = function(){
var ret = document.location.pathname + document.location.search
if (SL.settings.forceLowerCase){
ret = ret.toLowerCase()
}
return ret
}
SL.URL = function(){
var ret = document.location.href
if (SL.settings.forceLowerCase){
ret = ret.toLowerCase()
}
return ret
}
// Filter `SL.rules` down to only the once relevant for the current page.
SL.filterRules = function(){
function matches(rule){
if (!SL.isRuleActive(rule)) return false
return true
}
SL.rules = SL.filter(SL.rules, matches)
SL.pageLoadRules = SL.filter(SL.pageLoadRules, matches)
}
SL.ruleInScope = function(rule, location){
location = location || document.location
var scope = rule.scope
if (!scope) return true
var URI = scope.URI
var subdomains = scope.subdomains
var domains = scope.domains
var protocols = scope.protocols
var hashes = scope.hashes
if (URI && includeExcludeFails(URI, location.pathname + location.search)) return false
if (subdomains && includeExcludeFails(subdomains, location.hostname)) return false
if (domains && matchFails(domains, location.hostname)) return false
if (protocols && matchFails(protocols, location.protocol)) return false
if (hashes && includeExcludeFails(hashes, location.hash)) return false
function includeExcludeFails(matcher, matchee){
var include = matcher.include
var exclude = matcher.exclude
if (include && matchFails(include, matchee)) return true
if (exclude){
if (SL.isString(exclude) && exclude === matchee)
return true
if (SL.isArray(exclude) && SL.any(exclude, matches))
return true
if (SL.isRegex(exclude) && matches(exclude))
return true
}
return false
function matches(regex){
return matchee.match(regex)
}
}
function matchFails(matcher, matchee){
if (SL.isString(matcher) && matcher !== matchee)
return true
if (SL.isArray(matcher) && !SL.any(matcher, matches))
return true
if (SL.isRegex(matcher) && !matches(matcher))
return true
return false
function matches(regex){
return matchee.match(regex)
}
}
return true
}
// Run background tasks once. This will get invoked periodically.
SL.backgroundTasks = function(){
var start = +new Date()
SL.setFormListeners()
SL.setVideoListeners()
SL.loadStoredSettings()
SL.registerNewElementsForDynamicRules()
SL.eventEmitterBackgroundTasks()
// Trigger condition events
//SL.onEvent({type: 'condition', target: 'document'})
var end = +new Date()
// We want to keep an eye on the execution time here.
// If it gets to around 50ms for any customer site,
// we want to either optimize or start using a task queue
//SL.notify('Background tasks executed in ' + (end - start) + 'ms', 3)
}
// For rules that poll for dynamically injected elements on the page,
// find them and register events for them.
SL.registerNewElementsForDynamicRules = function(){
function cssQuery(selector, callback){
var hit = cssQuery.cache[selector]
if (hit){
return callback(hit)
}else{
SL.cssQuery(selector, function(elms){
cssQuery.cache[selector] = elms
callback(elms)
})
}
}
cssQuery.cache = {}
SL.each(SL.dynamicRules, function(rule){
cssQuery(rule.selector, function(elms){
SL.each(elms, function(elm){
var event = rule.event === 'custom' ? rule.customEvent : rule.event;
if (SL.$data(elm, 'dynamicRules.seen.' + event)) return
SL.$data(elm, 'dynamicRules.seen.' + event, true)
if (SL.propertiesMatch(rule.property, elm)){
SL.registerEvents(elm, [event])
}
})
})
})
}
// If the browser doesn't support CSS selector queries, we have to include one.
SL.ensureCSSSelector = function(){
if (document.querySelectorAll){
SL.hasSelector = true
return
}
SL.loadingSizzle = true
SL.sizzleQueue = []
SL.loadScript(SL.basePath() + 'selector.js', function(){
if (!SL.Sizzle){
SL.logError(new Error('Failed to load selector.js'))
return
}
var pending = SL.onEvent.pendingEvents
SL.each(pending, function(evt){
SL.handleEvent(evt)
}, this)
SL.onEvent = SL.handleEvent
SL.hasSelector = true
;delete SL.loadingSizzle
SL.each(SL.sizzleQueue, function(item){
SL.cssQuery(item[0], item[1])
})
;delete SL.sizzleQueue
})
}
// Error Handling
SL.errors = []
SL.logError = function(err){
SL.errors.push(err)
SL.notify(err.name + ' - ' + err.message, 5)
}
// `pageBottom()`
// --------------
//
// The function is to be called by the web page using an script tag like so:
//
// <script>_satellite.pageBottom()</script>
//
// just before the `</body>` tag.
SL.pageBottom = function(){
if (!SL.initialized) return
SL.pageBottomFired = true
SL.firePageLoadEvent('pagebottom')
}
// This allows Rover to configure the browser to use the staging library instead.
SL.stagingLibraryOverride = function(){
/*jshint evil:true */
var libraryOverride = SL.readStoredSetting('stagingLibrary') === 'true'
if (libraryOverride){ // allow Rover to override the library to staging
var scripts = document.getElementsByTagName('script')
, regex = /^(.*)satelliteLib-([a-f0-9]{40})\.js$/
, regexStaging = /^(.*)satelliteLib-([a-f0-9]{40})-staging\.js$/
, match
, matchStaging
, src
for (var i = 0, len = scripts.length; i < len; i++){
src = scripts[i].getAttribute('src')
if (!src) continue
if (!match) match = src.match(regex)
if (!matchStaging) matchStaging = src.match(regexStaging)
if (matchStaging) break
}
if (match && !matchStaging){
var stagingURL = match[1] + 'satelliteLib-' + match[2] + '-staging.js'
if (document.write) {
document.write('<script src="' + stagingURL + '"></script>')
} else {
var s = document.createElement('script')
s.src = stagingURL
document.head.appendChild(s)
}
return true
}
}
return false
}
SL.checkAsyncInclude = function(){
if (window.satellite_asyncLoad)
SL.notify('You may be using the async installation of Satellite. In-page HTML and the "pagebottom" event will not work. Please update your Satellite installation for these features.', 5)
}
SL.hasMultipleDomains = function(){
return !!SL.settings.domainList && SL.settings.domainList.length > 1
}
SL.handleOverrides = function(){
if (Overrides){
for (var key in Overrides){
if (Overrides.hasOwnProperty(key)){
SL.data[key] = Overrides[key]
}
}
}
}
SL.privacyManagerParams = function(){
var params = {}
SL.extend(params, SL.settings.privacyManagement)
var analyticsTools = []
for (var key in SL.tools){
if (SL.tools.hasOwnProperty(key)) {
var tool = SL.tools[key]
var settings = tool.settings
if (!settings) continue
if (settings.engine === 'sc'){
analyticsTools.push(tool)
}
}
}
var analyticsTrackingServers = SL.filter(SL.map(analyticsTools, function(tool){
return tool.getTrackingServer()
}), function(s){ return s != null })
params.adobeAnalyticsTrackingServers = analyticsTrackingServers
var substitutable = [
'bannerText',
'headline',
'introductoryText',
'customCSS'
]
for (var i = 0; i < substitutable.length; i++){
var prop = substitutable[i]
var spec = params[prop]
if (!spec) continue
if (spec.type === 'text'){
params[prop] = spec.value
}else if (spec.type === 'data'){
params[prop] = SL.getVar(spec.value)
}else{
throw new Error('Invalid type: ' + spec.type)
}
}
return params
}
SL.prepareLoadPrivacyManager = function(){
SL.addEventHandler(window, 'load', function(){
loadWhenAllSCToolsLoaded(SL.loadPrivacyManager)
})
function loadWhenAllSCToolsLoaded(callback){
var scTools = SL.filter(SL.values(SL.tools), function(tool){
return tool.settings && tool.settings.engine === 'sc'
})
if (scTools.length === 0){
return callback()
}
var numLoaded = 0
SL.each(scTools, function(tool){
SL.bindEvent(tool.id + '.load', onLoad)
})
var tid = setTimeout(onTimeout, 5000)
function onLoad(){
numLoaded++
if (numLoaded === scTools.length){
cleanUp()
clearTimeout(tid)
callback()
}
}
function cleanUp(){
SL.each(scTools, function(tool){
SL.unbindEvent(tool.id + '.load', onLoad)
})
}
function onTimeout(){
cleanUp()
callback()
}
}
}
// `loadPrivacyManager()`
// ----------------------
//
// Initialize privacy manager
SL.loadPrivacyManager = function(){
var scriptUrl = SL.basePath() + 'privacy_manager.js'
SL.loadScript(scriptUrl, function(){
var pm = SL.privacyManager
pm.configure(SL.privacyManagerParams())
pm.openIfRequired()
})
}
// `init()`
// --------
//
// Initialize Satellite.
//
// - `settings` - all the settings that comprising a library.
SL.init = function(settings) {
if (SL.stagingLibraryOverride())
return
SL.configurationSettings = settings
var tools = settings.tools
;delete settings.tools
for (var key in settings){
if (settings.hasOwnProperty(key)){
SL[key] = settings[key]
}
}
if(SL.data.customVars === undefined)
SL.data.customVars = {}
SL.data.queryParams = SL.QueryParams.normal
SL.handleOverrides()
SL.detectBrowserInfo()
if (SL.trackVisitorInfo)
SL.trackVisitorInfo()
SL.loadStoredSettings()
SL.Logger.setOutputState(SL.settings.notifications)
SL.checkAsyncInclude()
SL.ensureCSSSelector()
SL.filterRules()
SL.dynamicRules = SL.filter(SL.rules, function(rule){
return rule.eventHandlerOnElement
})
SL.tools = SL.initTools(tools)
SL.initEventEmitters()
SL.firePageLoadEvent('aftertoolinit')
if (SL.settings.privacyManagement){
SL.prepareLoadPrivacyManager()
}
if (SL.hasSelector)
SL.domReady(SL.eventEmitterBackgroundTasks)
SL.setListeners()
// Setup background tasks
SL.domReady(function() {
SL.poll(
function() { SL.backgroundTasks() },
SL.settings.recheckEvery || 3000
)
})
// Setup page load events
SL.domReady(function(){
SL.domReadyFired = true
if (!SL.pageBottomFired)
SL.pageBottom()
SL.firePageLoadEvent('domready')
})
SL.addEventHandler(window, 'load', function(){
SL.firePageLoadEvent('windowload')
})
SL.firePageLoadEvent('pagetop')
SL.initialized = true
}
SL.pageLoadPhases = ['aftertoolinit', 'pagetop', 'pagebottom', 'domready', 'windowload']
SL.loadEventBefore = function(one, other){
return SL.indexOf(SL.pageLoadPhases, one) <= SL.indexOf(SL.pageLoadPhases, other)
}
SL.flushPendingCalls = function(tool){
if (tool.pending){
SL.each(tool.pending, function(call){
var cmd = call[0]
, elm = call[1]
, evt = call[2]
, args = call[3]
if (cmd in tool)
tool[cmd].apply(tool, [elm, evt].concat(args))
else if (tool.emit)
tool.emit(cmd, elm, evt, args)
else
SL.notify('Failed to trigger ' + cmd +
' for tool ' + tool.id, 1)
})
;delete tool.pending
}
}
// setDebug(debug)
// --------------
//
// Activate or deactivate debug mode - within which
// log statements will be printed to the JS console.
//
// - `debug` - a boolean indicating whether debug mode
// should be turned on.
SL.setDebug = function(debug){
// When local storage is disabled on Safari, the mere act of referencing window.localStorage
// throws an error. For this reason, referencing window.localStorage without being inside
// a try-catch should be avoided.
try {
window.localStorage.setItem('sdsat_debug', debug)
} catch (e) {
SL.notify('Cannot set debug mode: ' + e.message, 2)
};
}
SL.getUserAgent = function() {
return navigator.userAgent;
};
SL.detectBrowserInfo = function(){
// Based on <http://jsbin.com/inubez/3/>
function matcher(regexs){
return function(userAgent){
for (var key in regexs){
if (regexs.hasOwnProperty(key)) {
var regex = regexs[key];
var match = regex.test(userAgent);
if (match) return key;
}
}
return "Unknown";
};
}
// The order in which these regular expressions are evaluated is important.
var getBrowser = matcher({
"IE Edge Mobile": /Windows Phone.*Edge/,
"IE Edge": /Edge/,
OmniWeb: /OmniWeb/,
"Opera Mini": /Opera Mini/,
"Opera Mobile": /Opera Mobi/,
Opera: /Opera/,
Chrome: /Chrome|CriOS|CrMo/,
Firefox: /Firefox|FxiOS/,
"IE Mobile": /IEMobile/,
IE: /MSIE|Trident/,
"Mobile Safari": /Mobile(\/[0-9A-z]+)? Safari/,
Safari: /Safari/
});
var getOS = matcher({
Blackberry: /BlackBerry|BB10/,
"Symbian OS": /Symbian|SymbOS/,
Maemo: /Maemo/,
Android: /Android/,
Linux: / Linux /,
Unix: /FreeBSD|OpenBSD|CrOS/,
Windows: /[\( ]Windows /,
iOS: /iPhone|iPad|iPod/,
MacOS: /Macintosh;/
});
var getDeviceType = matcher({
// This is not entirely accurate. A few old Samsung, Motorola, and Sony Ericsson phones
// will match but the majority and best guess is Nokia. Also, Nokia makes Windows phones and
// for those we will make it match Windows Phone and not Nokia.
Nokia: /Symbian|SymbOS|Maemo/,
"Windows Phone": /Windows Phone/,
Blackberry: /BlackBerry|BB10/,
Android: /Android/,
iPad: /iPad/,
iPod: /iPod/,
iPhone: /iPhone/,
Desktop: /.*/
});
var userAgent = SL.getUserAgent();
SL.browserInfo = {
browser: getBrowser(userAgent)
, os: getOS(userAgent)
, deviceType: getDeviceType(userAgent)
}
}
SL.isHttps = function(){
return 'https:' == document.location.protocol
}
SL.BaseTool = function(settings){
this.settings = settings || {}
this.forceLowerCase = SL.settings.forceLowerCase
if ('forceLowerCase' in this.settings){
this.forceLowerCase = this.settings.forceLowerCase
}
}
SL.BaseTool.prototype = {
triggerCommand: function(trig, elm, evt){
var settings = this.settings || {}
if (this.initialize && this.isQueueAvailable()){
if (this.isQueueable(trig) && evt && SL.loadEventBefore(evt.type, settings.loadOn)){
this.queueCommand(trig, elm, evt)
return
}
}
var cmd = trig.command
var method = this['$' + cmd]
var escapeHtml = method ? method.escapeHtml : false
var args = SL.preprocessArguments(
trig['arguments'],
elm,
evt,
this.forceLowerCase,
escapeHtml)
if (method){
method.apply(this, [elm, evt].concat(args))
}else if (this.$missing$){
this.$missing$(cmd, elm, evt, args)
}else
SL.notify('Failed to trigger ' + cmd +
' for tool ' + this.id, 1)
},
endPLPhase: function(pageLoadEvent){
// override to handle end initialization
},
isQueueable: function(trig){
// everything is queueable except `cancelToolInit`
return trig.command !== 'cancelToolInit'
},
isQueueAvailable: function(){
return !this.initialized && !this.initializing
},
flushQueue: function(){
if (this.pending){
SL.each(this.pending, function(args){
this.triggerCommand.apply(this, args)
}, this)
this.pending = []
}
},
queueCommand: function(trig, elm, evt){
if (!this.pending)
this.pending = []
this.pending.push([trig, elm, evt])
},
$cancelToolInit: function(){
this._cancelToolInit = true
}
}
// Set Satellite to the global variable `_satellite`.
window._satellite = SL
// Visibility API Event Emitter
// ============================
//
// The `visibility API` is used when the browser's tab gets hidden because
// another tab now is visible. For more information see Mozilla's [Page Visibility API](https://developer.mozilla.org/en-US/docs/Web/Guide/User_experience/Using_the_Page_Visibility_API)
SL.visibility = {
// Public
// ------------------------------------------------
// `isHidden()`
//
// The method returns true if the tab is hidden, otherwise false.
isHidden: function() {
var prop = this.getHiddenProperty();
if (!prop) return false;
return document[prop];
},
// `isVisible()`
//
// The method is an alias for the `!isHidden`.
isVisible: function() {
return !this.isHidden();
},
// Private
// ------------------------------------------------
getHiddenProperty: function() {
var prefixes = ['webkit', 'moz', 'ms', 'o'];
if ('hidden' in document) return 'hidden';
// otherwise loop over all the known prefixes until we find one
for (var i = 0; i < prefixes.length; i++) {
if ((prefixes[i] + 'Hidden') in document)
return prefixes[i] + 'Hidden';
}
// otherwise it's not supported
return null;
},
getVisibilityEvent: function() {
var ve = this.getHiddenProperty();
if (!ve) return null;
return ve.replace(/[H|h]idden/,'') + 'visibilitychange';
}
};
// E-Commerce APIs
// ---------------
//
// The ecommerce API allows web admins to integrate e-commerce tracking with Satellite.
// More details on the [GA E-Commerce API's](http://code.google.com/apis/analytics/docs/gaJS/gaJSApiEcommerce.html).
// Upon any of the methods on the API being called, they will fire an event, which
// in turn can be handled by a rule in the library.
SL.ecommerce = {
// `addItem(orderId, sku, name, category, price, quantity)`
// -------------------------------------
//
// Add an item to the transaction.
addItem: function(){
var args = [].slice.call(arguments)
SL.onEvent({type: 'ecommerce.additem', target: args})
},
// `addTrans(orderId, affiliation, total, tax, shipping, city, state, country)`
// ----------------------------------------------------------------------------
//
// Add a new transaction.
addTrans: function(){
var args = [].slice.call(arguments)
SL.data.saleData.sale = {
orderId: args[0],
revenue: args[2]
}
SL.onEvent({type: 'ecommerce.addtrans', target: args})
},
// `trackTrans()`
// --------------
//
// Send the transaction data that's been set up using `addItem()` and `addTrans()`
// to GA to be tracked.
trackTrans: function(){
SL.onEvent({type: 'ecommerce.tracktrans', target: []})
}
}
// Orientation Change Event Emitter
// ================================
//
// The `orientationchange` event on mobile devices fire when the devices switchs between
// portrait and landscape modes. You can use `%event.orientation%` in your command arguments
// to evaluate to either `portrait` or `landscape`.
function OrientationChangeEventEmitter(){
SL.addEventHandler(window, "orientationchange", OrientationChangeEventEmitter.orientationChange)
}
OrientationChangeEventEmitter.orientationChange = function (e) {
var orientation = window.orientation === 0 ?
'portrait' :
'landscape'
e.orientation = orientation
SL.onEvent(e)
}
SL.availableEventEmitters.push(OrientationChangeEventEmitter)
// InviewEventEmitter
// ==================
//
// Emits the `inview` event. The `inview` event fires on an element when the element
// first comes into the view of the user. If the element is in view immediately upon page
// load, it will be fired right away, if it only comes in view after some scrolling, it
// will fire then. An optional delay interval `inviewDelay` can be specified in the rule
// which determine how long the element has to be in view for before the event fires,
// of which the default value is 1 second.
function InViewEventEmitter(rules){
rules = rules || SL.rules
this.rules = SL.filter(rules, function(rule){
return rule.event === 'inview'
})
this.elements = []
this.eventHandler = SL.bind(this.track, this)
SL.addEventHandler(window, 'scroll', this.eventHandler)
SL.addEventHandler(window, 'load', this.eventHandler)
}
// Util functions needed by `InViewEventEmitter`
InViewEventEmitter.offset = function(elem) {
var top = null, left = null;
try {
var box = elem.getBoundingClientRect(),
doc = document,
docElem = doc.documentElement,
body = doc.body,
win = window,
clientTop = docElem.clientTop || body.clientTop || 0,
clientLeft = docElem.clientLeft || body.clientLeft || 0,
scrollTop = win.pageYOffset || docElem.scrollTop || body.scrollTop,
scrollLeft = win.pageXOffset || docElem.scrollLeft || body.scrollLeft;
top = box.top + scrollTop - clientTop;
left = box.left + scrollLeft - clientLeft;
} catch(e) {
}
return { top: top, left: left }
}
InViewEventEmitter.getViewportHeight = function() {
var height = window.innerHeight // Safari, Opera
var mode = document.compatMode
if (mode) { // IE, Gecko
height = (mode == 'CSS1Compat') ?
document.documentElement.clientHeight : // Standards
document.body.clientHeight // Quirks
}
return height
}
InViewEventEmitter.getScrollTop = function(){
return (document.documentElement.scrollTop ?
document.documentElement.scrollTop :
document.body.scrollTop)
}
InViewEventEmitter.isElementInDocument = function(el) {
return document.body.contains(el);
}
InViewEventEmitter.isElementInView = function(el) {
if (!InViewEventEmitter.isElementInDocument(el)) {
return false;
}
var vpH = InViewEventEmitter.getViewportHeight()
, scrolltop = InViewEventEmitter.getScrollTop()
, top = InViewEventEmitter.offset(el).top
, height = el.offsetHeight;
if (top !== null) {
return !(scrolltop > (top + height) || scrolltop + vpH < top)
}
return false;
}
InViewEventEmitter.prototype = {
backgroundTasks: function(){
var elements = this.elements
SL.each(this.rules, function(rule){
SL.cssQuery(rule.selector, function(elms){
var addCount = 0
SL.each(elms, function(elm){
if (!SL.contains(elements, elm)){
elements.push(elm)
addCount++
}
})
if (addCount){
SL.notify(rule.selector + ' added ' + addCount + ' elements.', 1)
}
})
})
this.track()
},
checkInView: function(el, recheck, delay){
var inview = SL.$data(el, 'inview');
if (InViewEventEmitter.isElementInView(el)) {
// it is in view now
if (!inview)
SL.$data(el, 'inview', true)
var self = this
this.processRules(el, function(rule, viewedProp, timeoutIdProp){
if (recheck || !rule.inviewDelay){
SL.$data(el, viewedProp, true)
SL.onEvent({type: 'inview', target: el, inviewDelay: rule.inviewDelay})
}else if(rule.inviewDelay){
var timeout = SL.$data(el, timeoutIdProp)
if (!timeout) {
timeout = setTimeout(function(){
self.checkInView(el, true, rule.inviewDelay)
}, rule.inviewDelay)
SL.$data(el, timeoutIdProp, timeout)
}
}
}, delay)
} else {
if (!InViewEventEmitter.isElementInDocument(el)) {
var idx = SL.indexOf(this.elements, el);
this.elements.splice(idx, 1)
}
// it is not in view now
if (inview)
SL.$data(el, 'inview', false)
this.processRules(el, function(rule, viewedProp, timeoutIdProp){
var timeout = SL.$data(el, timeoutIdProp)
if (timeout){
clearTimeout(timeout)
}
}, delay)
}
},
track: function(){
// We are not using SL.each here because we might do a splice inisde
// `checkInView` method.
for (var i = this.elements.length - 1; i >=0; i--) {
this.checkInView(this.elements[i]);
}
},
processRules: function(elm, callback, delay){
var filteredRules = this.rules;
if (delay) {
filteredRules = SL.filter(this.rules, function(e){
return e.inviewDelay == delay;
});
}
SL.each(filteredRules, function(rule, i){
// viewedProp: for rules that has a timeout, the definition for
// "viewed" is rule dependent. But for all rules that do not have
// a timeout, it is independent.
var viewedProp = rule.inviewDelay ? 'viewed_' + rule.inviewDelay : 'viewed'
var timeoutIdProp = 'inview_timeout_id_' + i
if (SL.$data(elm, viewedProp)) return
if (SL.matchesCss(rule.selector, elm)){
callback(rule, viewedProp, timeoutIdProp)
}
})
}
}
SL.availableEventEmitters.push(InViewEventEmitter)
// VideoPlayedEventEmitter
// =======================
//
// Emits the `videoplayed` event, given a specified percentage or duration, i.e. `videoplayed`
// is a parameterized event. A rule looks like this
//
// {
// name: "Video 10% complete",
// event: "videoplayed(10%)",
// selector: "#video",
// trigger: [
// {
// tool: "ga",
// command: "trackEvent",
// arguments: [
// "video",
// "video 10% complete",
// "from: %URI%"
// ]
// }
// ]
// }
//
// `10%` is in the paranthesis which indicates this rule will only fire when the 10%
// of the total length of the video has been played.
// You can also specifiy a duration in seconds, which looks like `videoplayed(8s)` - which
// stands for 8 seconds.
function VideoPlayedEventEmitter(){
this.rules = SL.filter(SL.rules, function(rule){
return rule.event.substring(0, 11) === 'videoplayed'
})
this.eventHandler = SL.bind(this.onUpdateTime, this)
}
VideoPlayedEventEmitter.prototype = {
backgroundTasks: function(){
var eventHandler = this.eventHandler
SL.each(this.rules, function(rule){
SL.cssQuery(rule.selector || 'video', function(elms){
SL.each(elms, function(elm){
if (SL.$data(elm, 'videoplayed.tracked')) return
SL.addEventHandler(elm, 'timeupdate', SL.throttle(eventHandler, 100))
SL.$data(elm, 'videoplayed.tracked', true)
})
})
})
},
evalRule: function(elm, rule){
var eventType = rule.event
, seekable = elm.seekable
, startTime = seekable.start(0)
, endTime = seekable.end(0)
, currentTime = elm.currentTime
, m = rule.event.match(/^videoplayed\(([0-9]+)([s%])\)$/)
if (!m) return
var unit = m[2]
, amount = Number(m[1])
var func = unit === '%' ?
function(){
return amount <=
100 * (currentTime - startTime) / (endTime - startTime)
} :
function(){
return amount <= currentTime - startTime
}
if (!SL.$data(elm, eventType) && func()){
SL.$data(elm, eventType, true)
SL.onEvent({type: eventType, target: elm})
}
},
onUpdateTime: function(e){
var rules = this.rules
, elm = e.target
if (!elm.seekable || elm.seekable.length === 0) return
for (var i = 0, len = rules.length; i < len; i++)
this.evalRule(elm, rules[i])
}
}
SL.availableEventEmitters.push(VideoPlayedEventEmitter)
// Leave Event Emitter
// ============================
//
// The page leave is an event that is used to detect the moment when the
// browser's tab gets closed.
//
function LeaveEventEmitter() {
if (SL.getToolsByType('nielsen').length > 0) {
SL.domReady(SL.bind(this.initialize, this));
}
}
LeaveEventEmitter.prototype = {
obue: false,
initialize: function() {
this.attachCloseListeners();
},
obuePrevUnload: function() {},
obuePrevBeforeUnload: function() {},
newObueListener: function() {
if (!this.obue) {
this.obue = true;
this.triggerBeacons();
}
},
attachCloseListeners: function() {
this.prevUnload = window.onunload;
this.prevBeforeUnload = window.onbeforeunload;
window.onunload = SL.bind(function(e) {
if (this.prevUnload) {
setTimeout(SL.bind(function() {
this.prevUnload.call(window, e);
}, this), 1);
}
this.newObueListener();
}, this);
window.onbeforeunload = SL.bind(function(e) {
if (this.prevBeforeUnload) {
setTimeout(SL.bind(function() {
this.prevBeforeUnload.call(window, e);
}, this), 1);
}
this.newObueListener();
}, this);
},
triggerBeacons: function() {
SL.fireEvent('leave', document);
}
}
SL.availableEventEmitters.push(LeaveEventEmitter);
// Facebook Event Emitter
// ======================
//
// Will track `edge.create`, `edge.remove` and `message.send` events from the Facebook
// Javascript API and emit `facebook.like`, `facebook.unlike` and `facebook.send` events
// respectively.
function FacebookEventEmitter(FB){
this.delay = 250;
this.FB = FB;
SL.domReady(SL.bind(function () {
SL.poll(SL.bind(this.initialize, this), this.delay, 8);
}, this));
}
FacebookEventEmitter.prototype = {
initialize: function() {
this.FB = this.FB || window.FB;
if (this.FB && this.FB.Event && this.FB.Event.subscribe) {
this.bind();
return true;
}
},
bind: function(){
this.FB.Event.subscribe('edge.create', function() {
SL.notify("tracking a facebook like", 1)
SL.onEvent({type: 'facebook.like', target: document})
});
this.FB.Event.subscribe('edge.remove', function() {
SL.notify("tracking a facebook unlike", 1)
SL.onEvent({type: 'facebook.unlike', target: document})
});
this.FB.Event.subscribe('message.send', function() {
SL.notify("tracking a facebook share", 1)
SL.onEvent({type: 'facebook.send', target: document})
});
}
}
SL.availableEventEmitters.push(FacebookEventEmitter);
// Visibility API Event Emitter
// ============================
//
// The `visibility API` is used when the browser's tab gets hidden because
// another tab now is visible. For more information see Mozilla's [Page Visibility API](https://developer.mozilla.org/en-US/docs/Web/Guide/User_experience/Using_the_Page_Visibility_API)
function VisibilityEventEmitter() {
this.defineEvents();
this.visibilityApiHasPriority = true;
if (!document.addEventListener) { // Older browers (e.g.: IE8)
this.attachDetachOlderEventListeners(true, document, 'focusout');
} else {
this.setVisibilityApiPriority(false);
}
var context = this;
SL.bindEvent('aftertoolinit', function() {
SL.fireEvent(SL.visibility.isHidden() ? 'tabblur' : 'tabfocus');
});
}
VisibilityEventEmitter.prototype = {
defineEvents: function() {
this.oldBlurClosure = function() {
SL.fireEvent('tabblur', document)
};
this.oldFocusClosure = SL.bind(function() {
if (this.visibilityApiHasPriority) {
SL.fireEvent('tabfocus', document);
} else {
if (SL.visibility.getHiddenProperty() != null) {
if(!SL.visibility.isHidden()) {
SL.fireEvent('tabfocus', document);
}
} else {
SL.fireEvent('tabfocus', document);
}
}
}, this);
},
attachDetachModernEventListeners: function(add) {
var method = (add == false ? 'removeEventHandler' : 'addEventHandler');
SL[method](document,
SL.visibility.getVisibilityEvent(),
this.handleVisibilityChange
);
},
attachDetachOlderEventListeners: function(add, blurTarget, blurEventName) {
var method = (add == false ? 'removeEventHandler' : 'addEventHandler');
SL[method](blurTarget, blurEventName, this.oldBlurClosure);
SL[method](window, 'focus', this.oldFocusClosure);
},
handleVisibilityChange: function() {
if (SL.visibility.isHidden()) {
SL.fireEvent('tabblur', document);
} else {
SL.fireEvent('tabfocus', document);
}
},
setVisibilityApiPriority: function(visibilityApiHasPriority) {
this.visibilityApiHasPriority = visibilityApiHasPriority;
this.attachDetachOlderEventListeners(false, window, 'blur');
this.attachDetachModernEventListeners(false);
if (visibilityApiHasPriority) {
if (SL.visibility.getHiddenProperty() != null) { // Modern browsers
this.attachDetachModernEventListeners(true);
} else {
this.attachDetachOlderEventListeners(true, window, 'blur');
}
} else {
this.attachDetachOlderEventListeners(true, window, 'blur');
if (SL.visibility.getHiddenProperty() != null) { // Modern browsers
this.attachDetachModernEventListeners(true);
}
}
},
oldBlurClosure: null,
oldFocusClosure: null,
visibilityApiHasPriority: true
};
SL.availableEventEmitters.push(VisibilityEventEmitter);
// Location Change Event Emitter
// =============================
//
// Will fire `locationchange` event whenever the browser location
// changes due to `hashchange`, `popstate`, `history.pushState()`,
// or `history.replaceState()`.
function LocationChangeEventEmitter(){
this.lastURL = SL.URL()
this._fireIfURIChanged = SL.bind(this.fireIfURIChanged, this)
this._onPopState = SL.bind(this.onPopState, this)
this._onHashChange = SL.bind(this.onHashChange, this)
this._pushState = SL.bind(this.pushState, this)
this._replaceState = SL.bind(this.replaceState, this)
this.initialize()
}
LocationChangeEventEmitter.prototype = {
initialize: function(){
this.setupHistoryAPI()
this.setupHashChange()
},
fireIfURIChanged: function(){
var URL = SL.URL()
if (this.lastURL !== URL){
this.fireEvent()
this.lastURL = URL
}
},
fireEvent: function(){
SL.updateQueryParams()
SL.onEvent({ type: 'locationchange', target: document })
},
setupSPASupport: function(){
this.setupHistoryAPI()
this.setupHashChange()
},
setupHistoryAPI: function(){
var history = window.history
if (history){
if (history.pushState){
this.originalPushState = history.pushState
history.pushState = this._pushState
}
if (history.replaceState){
this.originalReplaceState = history.replaceState
history.replaceState = this._replaceState
}
}
SL.addEventHandler(window, 'popstate', this._onPopState)
},
pushState: function(){
var ret = this.originalPushState.apply(history, arguments)
this.onPushState()
return ret
},
replaceState: function(){
var ret = this.originalReplaceState.apply(history, arguments)
this.onReplaceState()
return ret
},
setupHashChange: function(){
SL.addEventHandler(window, 'hashchange', this._onHashChange)
},
onReplaceState: function(){
setTimeout(this._fireIfURIChanged, 0)
},
onPushState: function(){
setTimeout(this._fireIfURIChanged, 0)
},
onPopState: function(){
setTimeout(this._fireIfURIChanged, 0)
},
onHashChange: function(){
setTimeout(this._fireIfURIChanged, 0)
},
uninitialize: function(){
this.cleanUpHistoryAPI()
this.cleanUpHashChange()
},
cleanUpHistoryAPI: function(){
if (history.pushState === this._pushState){
history.pushState = this.originalPushState
}
if (history.replaceState === this._replaceState){
history.replaceState = this.originalReplaceState
}
SL.removeEventHandler(window, 'popstate', this._onPopState)
},
cleanUpHashChange: function(){
SL.removeEventHandler(window, 'hashchange', this._onHashChange)
}
}
SL.availableEventEmitters.push(LocationChangeEventEmitter);
function DataElementChangeEmitter() {
var rules = SL.filter(SL.rules, function(rule) {
return rule.event.indexOf('dataelementchange') === 0;
});
this.dataElementsNames = SL.map(rules, function(rule) {
var matchedSubstrings = rule.event.match(/dataelementchange\((.*)\)/i);
return matchedSubstrings[1];
}, this);
this.initPolling();
}
// SL.stringify is not 100% compatible with JSON.stringify (for example JSON.stringify breaks
// whenever it encounters a cyclic reference). Since this check might become intensive,
// only for this case we would prefer using JSON.stringify whenever that's available.
DataElementChangeEmitter.prototype.getStringifiedValue =
(window.JSON && window.JSON.stringify) || SL.stringify;
DataElementChangeEmitter.prototype.initPolling = function() {
if (this.dataElementsNames.length === 0) {
return;
}
this.dataElementsStore = this.getDataElementsValues();
SL.poll(SL.bind(this.checkDataElementValues, this), 1000);
};
DataElementChangeEmitter.prototype.getDataElementsValues = function() {
var values = {};
SL.each(this.dataElementsNames, function(dataElementName) {
var value = SL.getVar(dataElementName);
values[dataElementName] = this.getStringifiedValue(value);
}, this);
return values;
};
DataElementChangeEmitter.prototype.checkDataElementValues = function() {
SL.each(this.dataElementsNames, SL.bind(function(dataElementName) {
var currentStringifiedValue = this.getStringifiedValue(SL.getVar(dataElementName));
var previousStringifiedValue = this.dataElementsStore[dataElementName];
if (currentStringifiedValue !== previousStringifiedValue) {
this.dataElementsStore[dataElementName] = currentStringifiedValue;
SL.onEvent({
type: 'dataelementchange(' + dataElementName + ')',
target: document
});
}
}, this));
};
SL.availableEventEmitters.push(DataElementChangeEmitter);
// ElementExistsEventEmitter
// ==================
//
// Emits the `elementexists` event. The `elementexists` event fires when an element
// of a specified selector becomes into existance - either because it's in the page
// markup or dynamically injected later on. *Each rule only fires once.*
function ElementExistsEventEmitter() {
this.rules = SL.filter(SL.rules, function(rule) {
return rule.event === 'elementexists';
});
}
ElementExistsEventEmitter.prototype.backgroundTasks = function() {
SL.each(this.rules, function(rule) {
SL.cssQuery(rule.selector, function(elms) {
if (elms.length > 0){
// This results in a bug: https://jira.corp.adobe.com/browse/DTM-6681
// The fix was reverted due to: https://jira.corp.adobe.com/browse/DTM-7377
var elm = elms[0];
if (SL.$data(elm, 'elementexists.seen')) return;
SL.$data(elm, 'elementexists.seen', true);
SL.onEvent({type: 'elementexists', target: elm});
}
})
})
}
SL.availableEventEmitters.push(ElementExistsEventEmitter);
// Hover Event Emitter
// =====================
//
// Emits the `hover` event in the event. This is better than `mouseover` because you can introduce a certain delay.
//
// {
// name: "Hover for 1 second"
// event: "hover(1000)",
// ...
// }
function HoverEventEmitter(){
var eventRegex = this.eventRegex = /^hover\(([0-9]+)\)$/
var rules = this.rules = []
SL.each(SL.rules, function(rule){
var m = rule.event.match(eventRegex)
if (m){
rules.push([
Number(rule.event.match(eventRegex)[1]),
rule.selector
])
}
})
}
HoverEventEmitter.prototype = {
backgroundTasks: function(){
var self = this
SL.each(this.rules, function(rule){
var selector = rule[1]
, delay = rule[0]
SL.cssQuery(selector, function(newElms){
SL.each(newElms, function(elm){
self.trackElement(elm, delay)
})
})
}, this)
},
trackElement: function(elm, delay){
var self = this
, trackDelays = SL.$data(elm, 'hover.delays')
if (!trackDelays){
SL.addEventHandler(elm, 'mouseover', function(e){
self.onMouseOver(e, elm)
})
SL.addEventHandler(elm, 'mouseout', function(e){
self.onMouseOut(e, elm)
})
SL.$data(elm, 'hover.delays', [delay])
}
else if (!SL.contains(trackDelays, delay)){
trackDelays.push(delay)
}
},
onMouseOver: function(e, elem){
var target = e.target || e.srcElement
, related = e.relatedTarget || e.fromElement
, hit = (elem === target || SL.containsElement(elem, target)) &&
!SL.containsElement(elem, related)
if (hit)
this.onMouseEnter(elem)
},
onMouseEnter: function(elm){
var delays = SL.$data(elm, 'hover.delays')
var delayTimers = SL.map(delays, function(delay){
return setTimeout(function(){
SL.onEvent({type: 'hover(' + delay + ')', target: elm})
}, delay)
})
SL.$data(elm, 'hover.delayTimers', delayTimers)
},
onMouseOut: function(e, elem){
var target = e.target || e.srcElement
, related = e.relatedTarget || e.toElement
, hit = (elem === target || SL.containsElement(elem, target)) &&
!SL.containsElement(elem, related)
if (hit)
this.onMouseLeave(elem)
},
onMouseLeave: function(elm){
var delayTimers = SL.$data(elm, 'hover.delayTimers')
if (delayTimers)
SL.each(delayTimers, function(timer){
clearTimeout(timer)
})
}
}
SL.availableEventEmitters.push(HoverEventEmitter)
// Twitter Event Emitter
// =====================
//
// Emits the `twitter.tweet` event in the event a user tweets from the site.
function TwitterEventEmitter(twttr){
SL.domReady(SL.bind(function () {
this.twttr = twttr || window.twttr;
this.initialize();
}, this));
}
TwitterEventEmitter.prototype = {
initialize: function(){
var twttr = this.twttr;
if (twttr && typeof twttr.ready === 'function') {
twttr.ready(SL.bind(this.bind, this));
}
},
bind: function(){
this.twttr.events.bind('tweet', function(event) {
if (event) {
SL.notify("tracking a tweet button", 1);
SL.onEvent({type: 'twitter.tweet', target: document});
}
});
}
}
SL.availableEventEmitters.push(TwitterEventEmitter)
// The Adobe Target Tool
// ==================
//
// This tool interacts with [Adobe Target library](https://git.corp.adobe.com/mc-visitor/VisitorAPI).
//
// The tool accepts the following settings:
//
// - `engine` - The engine identifier (tnt)
// - `mboxURL` - The URL where the mbox can be found
// - `loadSync` - Specifies how the mbox should be loaded. A true value means
// that it should be loaded in a synchronous mode.
// - `pageParams` - Object containing key/value pairs used in the mbox retrieval
// call. The pairs are merged onto the `targetPageParams` property of
// Target Javascript library. For more information click
// [here](https://marketing.adobe.com/resources/help/en_US/target/target/c_pass_parameters_to_global_mbox.html).
function Tnt(settings){
SL.BaseTool.call(this, settings)
this.styleElements = {}
this.targetPageParamsStore = {}
}
SL.inherit(Tnt, SL.BaseTool)
SL.extend(Tnt.prototype, {
// Public
// ------------------------------------------------
name: 'tnt',
// `endPLPhase()`
// ------------------------------------------------
//
// Method that starts the tool initialization when the page load phase is
// matched and only if the tool initialization has not been previously
// cancelled.
//
// When the tool is initialized the global `targetPageParams` are updated with
// the parameters provided in the settings.
//
// It is important to know that the `targetPageParams` property is not
// overwritten instead a merging process is taking place. If a key is already
// present then its value is updated.
//
// The last step is the loading of the mbox where the `mboxURL` is used.
endPLPhase: function(pageLoadEvent) {
if (pageLoadEvent === 'aftertoolinit') {
this.initialize();
}
},
// Private
// ------------------------------------------------
initialize: function() {
SL.notify('Test & Target: Initializing', 1)
this.initializeTargetPageParams()
this.load()
},
initializeTargetPageParams: function() {
if (window.targetPageParams) {
this.updateTargetPageParams(
this.parseTargetPageParamsResult(
window.targetPageParams()
)
)
}
this.updateTargetPageParams(this.settings.pageParams)
this.setTargetPageParamsFunction()
},
load: function(){
var url = this.getMboxURL(this.settings.mboxURL)
if (this.settings.initTool !== false){
if (this.settings.loadSync) {
SL.loadScriptSync(url)
this.onScriptLoaded()
} else {
SL.loadScript(url, SL.bind(this.onScriptLoaded, this))
this.initializing = true
}
} else {
this.initialized = true
}
},
getMboxURL: function(urlData) {
var url = urlData
if (SL.isObject(urlData)) {
if (window.location.protocol === 'https:')
url = urlData.https
else
url = urlData.http
}
if (!url.match(/^https?:/))
return SL.basePath() + url
else
return url
},
onScriptLoaded: function(){
SL.notify('Test & Target: loaded.', 1)
this.flushQueue()
this.initialized = true
this.initializing = false
},
$addMbox: function(elm, evt, settings){
var mboxGoesAround = settings.mboxGoesAround
var styleText = mboxGoesAround + '{visibility: hidden;}'
var styleElm = this.appendStyle(styleText)
if (!(mboxGoesAround in this.styleElements)){
this.styleElements[mboxGoesAround] = styleElm
}
if (this.initialized){
this.$addMBoxStep2(null, null, settings)
}else if (this.initializing){
this.queueCommand({
command: 'addMBoxStep2'
, "arguments": [settings]
}, elm, evt)
}
},
$addMBoxStep2: function(elm, evt, settings){
var mboxID = this.generateID()
var self = this
SL.addEventHandler(window, 'load', SL.bind(function(){
SL.cssQuery(settings.mboxGoesAround, function(elms){
var elem = elms[0]
if (!elem) return
var newDiv = document.createElement("div")
newDiv.id = mboxID
elem.parentNode.replaceChild(newDiv, elem)
newDiv.appendChild(elem)
window.mboxDefine(mboxID, settings.mboxName)
var args = [settings.mboxName]
if (settings.arguments){
args = args.concat(settings.arguments)
}
window.mboxUpdate.apply(null, args)
self.reappearWhenCallComesBack(elem, mboxID, settings.timeout, settings)
});
}, this))
this.lastMboxID = mboxID // leave this here for easier testing
},
$addTargetPageParams: function(elm, evt, pageParams) {
this.updateTargetPageParams(pageParams)
},
generateID: function(){
var id = '_sdsat_mbox_' + String(Math.random()).substring(2) + '_'
return id
},
appendStyle: function(css){
var head = document.getElementsByTagName('head')[0],
style = document.createElement('style');
style.type = 'text/css';
if(style.styleSheet){
style.styleSheet.cssText = css;
} else {
style.appendChild(document.createTextNode(css));
}
head.appendChild(style);
return style;
},
reappearWhenCallComesBack: function(elmGoesAround, mboxID, timeout, settings){
var self = this
function reappear(){
var styleElm = self.styleElements[settings.mboxGoesAround]
if (styleElm){
styleElm.parentNode.removeChild(styleElm)
;delete self.styleElements[settings.mboxGoesAround]
}
}
SL.cssQuery('script[src*="omtrdc.net"]', function(results){
var script = results[0]
if (script){
SL.scriptOnLoad(script.src, script, function(){
SL.notify('Test & Target: request complete', 1)
reappear()
clearTimeout(timeoutID)
})
var timeoutID = setTimeout(function(){
SL.notify('Test & Target: bailing after ' + timeout + 'ms', 1)
reappear()
}, timeout)
}else{
SL.notify('Test & Target: failed to find T&T ajax call, bailing', 1)
reappear()
}
})
},
updateTargetPageParams: function(obj) {
var o = {}
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
o[SL.replace(key)] = SL.replace(obj[key])
}
}
SL.extend(
this.targetPageParamsStore,
o
)
},
getTargetPageParams: function() {
return this.targetPageParamsStore
},
setTargetPageParamsFunction: function() {
window.targetPageParams = SL.bind(this.getTargetPageParams, this)
},
parseTargetPageParamsResult: function(data) {
var result = data
if(SL.isArray(data)) {
data = data.join('&')
}
if (SL.isString(data)) {
result = SL.parseQueryParams(data)
}
return result
}
})
SL.availableTools.tnt = Tnt
// The Nielsen Tool
// ================
//
// This tool provides the means to make Nielsen tracking possible.
//
// The tool accepts the following settings:
//
// - `collectionServer` - The collection server to be used. The variable
// specifies the nearest collection server.
// - `clientId` - The client identifier. A unique Nielsen supplied ID that
// should be alphanumeric and lowercase. A dash (-) character is allowed.
// - `contentGroup` - The content group. A historical variable used for
// grouping/aggregating content into channels. Currently the
// default value is "0".
function NielsenTool(settings) {
SL.BaseTool.call(this, settings);
this.defineListeners();
this.beaconMethod = 'plainBeacon';
this.adapt = new NielsenTool.DataAdapters();
this.dataProvider = new NielsenTool.DataProvider.Aggregate();
}
SL.inherit(NielsenTool, SL.BaseTool);
SL.extend(NielsenTool.prototype, {
// Public
// ------------------------------------------------
name: 'Nielsen',
// Private
// ------------------------------------------------
// `endPLPhase()`
// ------------------------------------------------
//
// Method that starts the tool initialization when the page load phase is
// matched and only if the tool initialization has not been previously
// cancelled.
//
// This is needed in order to be able to properly hook the needed events.
endPLPhase: function(pageLoadEvent) {
switch (pageLoadEvent) {
case 'pagetop':
this.initialize();
break;
case 'pagebottom':
if (this.enableTracking) {
this.queueCommand({ command: 'sendFirstBeacon', "arguments": [] });
this.flushQueueWhenReady();
}
break;
}
},
defineListeners: function() {
this.onTabFocus = SL.bind(function() {
this.notify('Tab visible, sending view beacon when ready', 1);
this.tabEverVisible = true;
this.flushQueueWhenReady();
}, this);
this.onPageLeave = SL.bind(function() {
this.notify('isHuman? : '+ this.isHuman(), 1);
if (this.isHuman()) {
this.sendDurationBeacon(); // track page leave
}
}, this);
this.onHumanDetectionChange = SL.bind(function(e) {
if (this == e.target.target) this.human = e.target.isHuman;
}, this);
},
initialize: function() {
this.initializeTracking();
this.initializeDataProviders();
this.initializeNonHumanDetection();
this.tabEverVisible = SL.visibility.isVisible();
if (!this.tabEverVisible) {
SL.bindEventOnce('tabfocus', this.onTabFocus);
}
else {
this.notify('Tab visible, sending view beacon when ready', 1);
}
this.initialized = true;
},
// `initializeTracking()`
// ------------------------------------------------
//
// The method starts the time tracking and hooks on the leave event.
initializeTracking: function() {
if (this.initialized) return;
this.notify('Initializing tracking', 1);
this.addRemovePageLeaveEvent(this.enableTracking);
this.addRemoveHumanDetectionChangeEvent(this.enableTracking);
this.initialized = true;
},
// `initializeDataProviders()`
// ------------------------------------------------
//
// The method initializes default data providers for:
// - Analytics Report Suite ID, if Analytics account is linked
// - Marketing Cloud Visitor ID, with fallback to auto-generated UUID
initializeDataProviders: function() {
var analytics = this.getAnalyticsTool(), rsid;
this.dataProvider.register(
new NielsenTool.DataProvider.VisitorID(
SL.getVisitorId()
)
);
if (analytics) {
rsid = new NielsenTool.DataProvider.Generic('rsid', function() {
return analytics.settings.account;
});
this.dataProvider.register(rsid);
}
else {
this.notify('Missing integration with Analytics: rsid will not be sent.');
}
},
initializeNonHumanDetection: function() {
if (SL.nonhumandetection) {
SL.nonhumandetection.init();
this.setEnableNonHumanDetection(
this.settings.enableNonHumanDetection == false ? false : true);
if (this.settings.nonHumanDetectionDelay > 0) {
this.setNonHumanDetectionDelay(
parseInt(this.settings.nonHumanDetectionDelay) * 1000);
}
} else {
this.notify('NHDM is not available.');
}
},
// `getAnalyticsTool()`
// ------------------------------------------------
//
// If integration is defined, this method returns the tool instance of
// the linked Analytics account
getAnalyticsTool: function() {
if (this.settings.integratesWith) {
return SL.tools[this.settings.integratesWith];
}
},
flushQueueWhenReady: function() {
if (!this.enableTracking || !this.tabEverVisible) return;
SL.poll(SL.bind(function() {
if (this.isReadyToTrack()) {
this.flushQueue();
return true;
}
}, this), 100, 20);
},
isReadyToTrack: function() {
return this.tabEverVisible && this.dataProvider.isReady();
},
// `setVars(vars)`
// ------------------------------------------------
//
// The method is used to set variables on the tool
$setVars: function(elm, evt, vars) {
for (var v in vars) {
var val = vars[v];
if (typeof val === 'function')
val = val();
this.settings[v] = val;
}
this.notify('Set variables done', 2);
this.prepareContextData();
},
// `setEnableTracking()`
// ------------------------------------------------
//
// The method triggers the view tracking call.
$setEnableTracking: function(elm, evt, bool) {
this.notify('Will' + (!bool ? ' not' : '') + ' track time on page', 1);
if (this.enableTracking != bool) {
this.addRemovePageLeaveEvent(bool);
this.addRemoveHumanDetectionChangeEvent(bool);
this.enableTracking = bool;
}
},
// `sendFirstBeacon()`
// ------------------------------------------------
//
// The method is called as soon as everything is in place.
$sendFirstBeacon: function(elm, evt, settings) {
this.sendViewBeacon();
},
// `setEnableNonHumanDetection()`
// ------------------------------------------------
//
// The method enables/disables the human detection mechanism.
setEnableNonHumanDetection: function(bool) {
if (bool) {
SL.nonhumandetection.register(this);
} else {
SL.nonhumandetection.unregister(this);
}
},
// `setNonHumanDetectionDelay()`
// ------------------------------------------------
//
// The method set the timeout for entering in non human state.
setNonHumanDetectionDelay: function(delay) {
SL.nonhumandetection.register(this, delay);
},
addRemovePageLeaveEvent: function(add) {
this.notify((add ? 'Attach onto' : 'Detach from') + ' page leave event', 1);
var method = (add == false ? 'unbindEvent' : 'bindEvent');
SL[method]('leave', this.onPageLeave);
},
addRemoveHumanDetectionChangeEvent: function(add) {
this.notify((add ? 'Attach onto' : 'Detach from') + ' human detection change event', 1);
var method = (add == false ? 'unbindEvent' : 'bindEvent');
SL[method]('humandetection.change', this.onHumanDetectionChange);
},
// `sendViewBeacon()`
// ------------------------------------------------
//
// The method triggers the view tracking call.
sendViewBeacon: function() {
this.notify('Tracked page view.', 1);
this.sendBeaconWith();
},
// `sendDurationBeacon()`
// ------------------------------------------------
//
// The method triggers the duration tracking call. This adds the time
// spent on the page to the call and is triggered when the user leaves
// the current web page.
sendDurationBeacon: function() {
if (
!SL.timetracking ||
typeof SL.timetracking.timeOnPage != 'function' ||
SL.timetracking.timeOnPage() == null
) {
this.notify('Could not track close due missing time on page', 5);
return;
}
this.notify('Tracked close', 1);
this.sendBeaconWith({
timeOnPage: Math.round(SL.timetracking.timeOnPage() / 1000),
duration: 'D',
timer: 'timer'
});
// a bit of delay to let the network thread finish sending data
var i,s='';for(i=0;i<this.magicConst;i++){s+='0'};
},
// `sendBeaconWith(obj)`
// ------------------------------------------------
//
// The method builds the tracking call based on provided settings and
// parameters.
sendBeaconWith: function(params) {
if (this.enableTracking) {
this[this.beaconMethod].call(this, this.prepareUrl(params));
}
},
plainBeacon: function(url) {
var img = new Image();
img.src = url;
img.width = 1;
img.height = 1;
img.alt = '';
},
navigatorSendBeacon: function(url) {
navigator.sendBeacon(url);
},
prepareUrl: function(params) {
var obj = this.settings;
SL.extend(obj, this.dataProvider.provide());
SL.extend(obj, params);
return this.preparePrefix(this.settings.collectionServer) +
this.adapt.convertToURI(
this.adapt.toNielsen(
this.substituteVariables(obj)));
},
preparePrefix: function(server) {
return '//' + encodeURIComponent(server) + '.imrworldwide.com/cgi-bin/gn?';
},
substituteVariables: function(hash){
var obj = {};
for (var v in hash) {
if (hash.hasOwnProperty(v)) {
obj[v] = SL.replace(hash[v]);
}
}
return obj;
},
prepareContextData: function() {
if (!this.getAnalyticsTool()) {
this.notify('Adobe Analytics missing.');
return;
}
var obj = this.settings;
obj.sdkVersion =_satellite.publishDate;
this.getAnalyticsTool().$setVars(null, null, {
contextData: this.adapt.toAnalytics(
this.substituteVariables(obj))
});
},
isHuman: function() {
return this.human;
},
onTabFocus: function() {},
onPageLeave: function() {},
onHumanDetectionChange: function() {},
notify: function(msg, lvl) {
SL.notify(this.logPrefix + msg, lvl);
},
beaconMethod: 'plainBeacon',
adapt: null,
enableTracking: false,
logPrefix: "Nielsen: ",
tabEverVisible: false,
human: true,
magicConst: 0x1e8480
});
// `NielsenTool.DataProvider`
// ==========================
//
// The following components handle the task of providing extra information
// for the Nielsen beacon, with support for asynchronous data
//
NielsenTool.DataProvider = {};
NielsenTool.DataProvider.Generic = function(key, valueFn) {
this.key = key;
this.valueFn = valueFn;
};
SL.extend(NielsenTool.DataProvider.Generic.prototype, {
isReady: function() {
return true;
},
getValue: function() {
return this.valueFn();
},
provide: function() {
if (!this.isReady()) {
NielsenTool.prototype.notify('Not yet ready to provide value for: ' + this.key, 5)
}
var data = {};
data[this.key] = this.getValue();
return data;
}
});
// `NielsenTool.DataProvider.VisitorID`
// ====================================
//
// Gets and optionally waits for Marketing Cloud ID to be loaded.
// If no visitor instance is provided, then it falls-back to generated UUID.
//
NielsenTool.DataProvider.VisitorID = function(visitorInstance, key, fallbackProvider) {
this.key = key || 'uuid';
this.visitorInstance = visitorInstance;
if (this.visitorInstance) {
this.visitorId = visitorInstance.getMarketingCloudVisitorID([this, this._visitorIdCallback]);
}
this.fallbackProvider = fallbackProvider || new NielsenTool.UUID();
};
SL.inherit(NielsenTool.DataProvider.VisitorID, NielsenTool.DataProvider.Generic);
SL.extend(NielsenTool.DataProvider.VisitorID.prototype, {
isReady: function() {
if (this.visitorInstance === null) {
return true;
}
return !!this.visitorId;
},
getValue: function() {
return this.visitorId || this.fallbackProvider.get();
},
_visitorIdCallback: function(id) {
this.visitorId = id;
}
});
// `NielsenTool.DataProvider.Aggregate`
// ====================================
//
// Aggregates data from multiple providers, being aware of their ready-state.
//
NielsenTool.DataProvider.Aggregate = function() {
this.providers = [];
for (var i=0; i<arguments.length; i++) {
this.register(arguments[i]);
}
};
SL.extend(NielsenTool.DataProvider.Aggregate.prototype, {
register: function(provider) {
this.providers.push(provider);
},
isReady: function() {
return SL.every(this.providers, function(provider) {
return provider.isReady();
});
},
provide: function() {
var data = {};
SL.each(this.providers, function(provider) {
SL.extend(data, provider.provide());
});
return data;
}
});
// `UUID`
// ===============
//
// The follwing generates an [RFC 4122 version 4](https://www.ietf.org/rfc/rfc4122.txt)
// uinique ID and stores it in a cookie.
NielsenTool.UUID = function() {};
SL.extend(NielsenTool.UUID.prototype, {
// `generate()`
// ------------------------------------------------
//
// Method that generates an [RFC 4122 version 4](https://www.ietf.org/rfc/rfc4122.txt)
// compliant unique ID.
//
// This is needed in for Nielsen tracking w/o Analytics integration.
generate: function() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random() * 16 | 0,
v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
},
get: function() {
var cookieUUID = SL.readCookie(this.key('uuid'));
if (cookieUUID) return cookieUUID;
cookieUUID = this.generate();
SL.setCookie(this.key('uuid'), cookieUUID);
return cookieUUID;
},
key: function(name) {
return '_dtm_nielsen_' + name;
}
});
// `Data Adapters`
// ===============
//
// The follwing adapters are used to adapt the settings to the proper format
// for both Nielsen tracking call and AA tracking calls
NielsenTool.DataAdapters = function() {};
SL.extend(NielsenTool.DataAdapters.prototype, {
toNielsen: function(settings) {
var cdate = new Date().getTime(),
nielsenPrefixes = {
c6: 'vc,',
c13: 'asid,',
c15: 'apn,',
c27: 'cln,',
c32: 'segA,',
c33: 'segB,',
c34: 'segC,',
c35: 'adrsid,',
c29: 'plid,',
c30: 'bldv,',
c40: 'adbid,'
},
nielsenObj = {
ci: settings.clientId,
c6: settings.vcid,
c13: settings.appId,
c15: settings.appName,
prv: 1,
forward: 0,
ad: 0,
cr: settings.duration || 'V', // [V|D], default V
rt: 'text',
st: 'dcr',
prd: 'dcr',
r: cdate,
at: settings.timer || 'view', // [view|timer], default view
c16: settings.sdkVersion,
c27: settings.timeOnPage || 0,
c40: settings.uuid,
c35: settings.rsid,
ti: cdate,
sup: 0,
c32: settings.segmentA,
c33: settings.segmentB,
c34: settings.segmentC,
asn: settings.assetName,
c29: settings.playerID,
c30: settings.buildVersion
};
for (key in nielsenObj) {
if (nielsenObj[key] !== undefined && nielsenObj[key] != null) {
if (nielsenObj[key] !== undefined && nielsenObj != null && nielsenObj != '') {
var val = encodeURIComponent(nielsenObj[key]);
if (nielsenPrefixes.hasOwnProperty(key) && val) {
val = nielsenPrefixes[key] + val;
}
nielsenObj[key] = val;
}
}
}
return this.filterObject(nielsenObj);
},
toAnalytics: function(settings) {
return this.filterObject({
'a.nielsen.clientid': settings.clientId,
'a.nielsen.vcid': settings.vcid,
'a.nielsen.appid': settings.appId,
'a.nielsen.appname': settings.appName,
'a.nielsen.accmethod': "0",
'a.nielsen.ctype': "text",
'a.nielsen.sega': settings.segmentA,
'a.nielsen.segb': settings.segmentB,
'a.nielsen.segc': settings.segmentC,
'a.nielsen.asset': settings.assetName
});
},
convertToURI: function(obj) {
if (SL.isObject(obj) === false) return '';
var uri = []
for (var key in obj) {
if (obj.hasOwnProperty(key)) uri.push(key + '=' + obj[key]);
}
return uri.join('&')
},
filterObject: function(obj) {
for (var k in obj) {
if (obj.hasOwnProperty(k) &&
(obj[k] == null || obj[k] === undefined)) {
delete obj[k];
}
}
return obj;
}
});
SL.availableTools.nielsen = NielsenTool;
// Adobe Analytics Tool
// ================
//
// This tool interacts with the [AppMeasurement library](http://microsite.omniture.com/t2/help/en_US/sc/appmeasurement/release/c_release_notes_mjs.html)
//
// Beside the settings that are processed by the BaseTool code, this tool uses
// the following extra settings:
//
// - `engine` - The engine identifier (sc)
// - `initVars` - It's an array containing key/value pair of AppMeasurement's
// properties that are used in tracking and for settings. An example of
// such pair would be: `{ eVar6: "6", server: "tracking.server"}`. For a
// list of all supported properties please consult the [AppMeasurement's
// documentation](http://microsite.omniture.com/t2/help/en_US/sc/implement/sc_variables.html).
// - `initTool` - Boolean flag that can suppress the tool initialization phase.
// When set to `false` no JS library will be loaded and no initial command
// will be executed. All the later commands triggered by this tool will
// piggy back on any availble `ga` function from the page.
// - `sCodeURL` - Custom URL of the AppMeasurement Javascript library URL
// location.
// - `loadOn` - The PL phase when this tool will be initialized (top | bottom)
// - `account` - String containing the report suite ID to track to.
// - `skipSetAccount` - Boolean value that when true disables setting
// of the `account` with the value provided in settings. Default value
// is no being set.
// - `euCookie' - Please see the description on SL (core.js) code
// - `renameS` - String specifying the name of the global AppMeasurement
// instance. If no provided `s` is implied.
// - `executeCustomPageCodeFirst` - Boolean flag that lets the custom
// initialization code be executed before or after the `initVars` method
// call. Default value is not set which means false.
// - `customInit` - JS code that will be executed immediately after the tool is
// initialized. The boolean result from `customInit` will affect the
// initial page view call. A false value results in disabling the initial
// page view tracking call.
//
// The SiteCatalystTool allows to set variables, add events, track link, etc.
// Example:
//
// trigger: [
// {
// tool: "sc",
// command: "trackLink"
// }
// ]
//
function SiteCatalystTool(settings){
SL.BaseTool.call(this, settings)
this.varBindings = {}
this.events = []
this.products = []
this.customSetupFuns = []
}
SL.inherit(SiteCatalystTool, SL.BaseTool)
SL.extend(SiteCatalystTool.prototype, {
// Public
// ------------------------------------------------
name: 'SC',
// `endPLPhase()`
// ------------------------------------------------
//
// Method that starts the tool initialization when the page load phase is
// matched and only if the tool initialization has not been previously
// cancelled. Find out more info about the initializing sequence by clicking
// [here](#-initialize-).
//
// After the tool is initialized a page view call is triggered if
// `suppressInitialPageView` flag is not set to `true`.
endPLPhase: function(pageLoadEvent){
var loadOn = this.settings.loadOn
if (pageLoadEvent === loadOn){
this.initialize(pageLoadEvent)
}
},
// Private
// ------------------------------------------------
// `initialize()`
// ------------------------------------------------
//
// The method first check to see if the default initialization is specifically
// canceled.
//
// Then it sets an event listener on `pageLoadeEvent` to update the tracking
// variables with the ones provided in `initVars` setting object.
//
// In case that the user chosen to provide the Javascript code for
// AppMeasurement by himself instead of using the automatic management
// then we wait for the library to load.
//
// Otherwise we load the AppMeasurement from the storage and then set the
// setup variables on the tracker object.
initialize: function(pageLoadEvent){
if (this._cancelToolInit) return
this.settings.initVars = this.substituteVariables(
this.settings.initVars, { type: pageLoadEvent }
)
if (this.settings.initTool !== false){
var url = this.settings.sCodeURL || SL.basePath() + 's_code.js'
if (typeof url === 'object'){
if (window.location.protocol === 'https:')
url = url.https
else
url = url.http
}
if (!url.match(/^https?:/))
url = SL.basePath() + url
if (this.settings.initVars){
this.$setVars(null, null, this.settings.initVars)
}
SL.loadScript(url, SL.bind(this.onSCodeLoaded, this))
this.initializing = true
}else{
// Set to initializing because we are
// waiting on the AppMeasurement/s_code library to be loaded by
// the site and we'll detect the completion of the load
// in a background task.
this.initializing = true
this.pollForSC()
}
},
// `getS(s, options)`
// ------------------------------------------------
//
// The method initializes the `s` object.
//
// A notificaiton is given and `null` is returned in case of not finding
// the account/RSID.
//
// If Marketing Cloud Visitor ID Service is used that instance is linked
// with the instatiated `s` object.
getS: function(s, options){
var hostname = options && options.hostname || window.location.hostname
var varBindings = this.concatWithToolVarBindings(
options && options.setVars || this.varBindings
)
var events = options && options.addEvent || this.events
var acct = this.getAccount(hostname)
var s_gi = window.s_gi
if (!s_gi) return null
if (!this.isValidSCInstance(s)) s = null
if (!acct && !s) {
SL.notify('Adobe Analytics: tracker not initialized because account was not found', 1)
return null
}
var s = s || s_gi(acct)
var DTMversion = 'D' + SL.appVersion;
if(typeof s.tagContainerMarker !== 'undefined') {
s.tagContainerMarker = DTMversion
} else {
if (typeof s.version === 'string' &&
s.version.substring(s.version.length - 5) !==
('-' + DTMversion)){
s.version += '-' + DTMversion
}
}
if (s.sa && this.settings.skipSetAccount !== true && this.settings.initTool !== false) s.sa(this.settings.account)
this.applyVarBindingsOnTracker(s, varBindings)
if (events.length > 0)
s.events = events.join(',')
var visitorIdInstance = SL.getVisitorId()
if (visitorIdInstance) {
s.visitor = SL.getVisitorId()
}
return s
},
// `onSCodeLoaded()`
// ------------------------------------------------
//
// The method triggers load event on Analytics tool so all subsequent and
// listening methods would be properly triggered.
//
// Before cleaning up the queue the tracking beacon call is made.
onSCodeLoaded: function(loaded_manually){
this.initialized = true
this.initializing = false
var msg = [
'Adobe Analytics: loaded',
loaded_manually ? ' (manual)' : '',
'.'
]
SL.notify(msg.join(''), 1)
SL.fireEvent(this.id + '.load', this.getS())
if (!loaded_manually) {
this.flushQueueExceptTrackLink()
this.sendBeacon()
}
this.flushQueue()
},
// `getAccount(hostname)`
// ------------------------------------------------
//
// The returns the `s_account` for a specified `hostname`
//
// TODO: need to be refactored because `accountByHost` is no longer used.
getAccount: function(hostname){
if (window.s_account){
return window.s_account
}
if (hostname && this.settings.accountByHost){
return this.settings.accountByHost[hostname] || this.settings.account
}else{
return this.settings.account
}
},
// `getTrackingServer()`
// ------------------------------------------------
//
// The method tries to retrieve the tracking server from the `s` object
// otherwise falls back on generating one based on the `account`.
//
// If neither `account` or `trackingServer` are availalble, `null` is
// returned.
//
// TODO: need to be refactored to remove the tracking server generate method
// as Analytics now offers a central point to shoot to.
getTrackingServer: function(){
var tool = this
var s = tool.getS()
if (s) {
if (s.ssl && s.trackingServerSecure) {
return s.trackingServerSecure
}
else if (s.trackingServer) {
return s.trackingServer
}
}
var account = tool.getAccount(window.location.hostname)
if (!account) return null
// Based on code in app measurement.
var w
var c = ''
var d = s && s.dc
var e
var f
w = account
e = w.indexOf(",")
e >= 0 && (w = w.gb(0, e))
w = w.replace(/[^A-Za-z0-9]/g, "")
c || (c = "2o7.net")
d = d ? ("" + d).toLowerCase() : "d1"
c == "2o7.net" && (d == "d1" ? d = "112" : d == "d2" && (d = "122"), f = "")
e = w + "." + d + "." + f + c
return e
},
// `sendBeacon()`
// ------------------------------------------------
//
// The method triggers the tracking call.
//
// If custom initialization is used the beacon is supressed. Also, if custom
// code is provided and specifically stated that it should be executed first
// (`executeCustomPageCodeFirst`) the tracker get updated with the result of
// the code.
sendBeacon: function(){
var s = this.getS(window[this.settings.renameS || 's'])
if (!s){
SL.notify('Adobe Analytics: page code not loaded', 1)
return
}
if (this.settings.customInit){
if (this.settings.customInit(s) === false){
SL.notify("Adobe Analytics: custom init suppressed beacon", 1)
return
}
}
if (this.settings.executeCustomPageCodeFirst) {
this.applyVarBindingsOnTracker(s, this.varBindings)
}
this.executeCustomSetupFuns(s)
s.t()
this.clearVarBindings()
this.clearCustomSetup()
SL.notify("Adobe Analytics: tracked page view", 1)
},
pollForSC: function(){
SL.poll(SL.bind(function(){
if (typeof window.s_gi === 'function'){
this.onSCodeLoaded(true)
return true
}
}, this))
},
flushQueueExceptTrackLink: function(){
// Because we always s.tl() after the first s.t()
// that way the variables set by s.tl() will not
// contaminate the s.t() call.
if (!this.pending) return
var left = []
for (var i = 0; i < this.pending.length; i++){
var args = this.pending[i]
var trig = args[0]
if (trig.command === 'trackLink'){
left.push(args)
}else{
this.triggerCommand.apply(this, args)
}
}
this.pending = left
},
isQueueAvailable: function(){
return !this.initialized
},
substituteVariables: function(obj, evt){
var ret = {}
for (var key in obj){
if (obj.hasOwnProperty(key)) {
var value = obj[key]
ret[key] = SL.replace(value, location, evt)
}
}
return ret
},
$setVars: function(elm, evt, vars){
for (var v in vars){
if (vars.hasOwnProperty(v)) {
var val = vars[v]
if (typeof val === 'function')
val = val()
this.varBindings[v] = val
}
}
SL.notify('Adobe Analytics: set variables.', 2)
},
$customSetup: function(elm, evt, setup){
this.customSetupFuns.push(function(s){
setup.call(elm, evt, s)
})
},
isValidSCInstance: function(s) {
return !!s && typeof s.t === 'function' && typeof s.tl === 'function'
},
concatWithToolVarBindings: function(varBindings){
var settingsInitVars = this.settings.initVars || {}
SL.map(['trackingServer', 'trackingServerSecure'], function (item) {
if (settingsInitVars[item] && !varBindings[item]) {
varBindings[item] = settingsInitVars[item]
}
});
return varBindings
},
applyVarBindingsOnTracker: function (s, varBindings) {
for (var v in varBindings){
if (varBindings.hasOwnProperty(v)) {
s[v] = varBindings[v]
}
}
},
clearVarBindings: function(){
this.varBindings = {}
},
clearCustomSetup: function(){
this.customSetupFuns = []
},
executeCustomSetupFuns: function(s){
SL.each(this.customSetupFuns, function(fun){
fun.call(window, s)
})
},
$trackLink: function(elm, evt, params){
params = params || {}
var type = params.type
var linkName = params.linkName
if (!linkName &&
elm &&
elm.nodeName &&
elm.nodeName.toLowerCase() === 'a'){
linkName = elm.innerHTML
}
if (!linkName){
linkName = 'link clicked'
}
var vars = params && params.setVars
var events = (params && params.addEvent) || []
var s = this.getS(null, {
setVars: vars,
addEvent: events
})
if (!s){
SL.notify('Adobe Analytics: page code not loaded', 1)
return
}
var orgLinkTrackVars = s.linkTrackVars
var orgLinkTrackEvents = s.linkTrackEvents
var definedVarNames = this.definedVarNames(vars)
if (params && params.customSetup){
params.customSetup.call(elm, evt, s)
}
if (events.length > 0)
definedVarNames.push('events')
if (s.products)
definedVarNames.push('products')
// add back the vars from s
definedVarNames = this.mergeTrackLinkVars(s.linkTrackVars, definedVarNames)
// add back events from s
events = this.mergeTrackLinkVars(s.linkTrackEvents, events)
s.linkTrackVars = this.getCustomLinkVarsList(definedVarNames)
var eventsKeys = SL.map(events, function(item) {
return item.split(':')[0]
});
s.linkTrackEvents = this.getCustomLinkVarsList(eventsKeys)
s.tl(true, type || 'o', linkName)
SL.notify([
'Adobe Analytics: tracked link ',
'using: linkTrackVars=',
SL.stringify(s.linkTrackVars),
'; linkTrackEvents=',
SL.stringify(s.linkTrackEvents)
].join(''), 1)
s.linkTrackVars = orgLinkTrackVars
s.linkTrackEvents = orgLinkTrackEvents
},
mergeTrackLinkVars: function(newVarsStr, varsArr){
if (newVarsStr) {
varsArr = newVarsStr.split(',').concat(varsArr)
}
return varsArr
},
getCustomLinkVarsList: function (keysArr) {
var noneIndex = SL.indexOf(keysArr, 'None');
if (noneIndex > -1 && keysArr.length > 1) {
keysArr.splice(noneIndex, 1)
}
return keysArr.join(',');
},
definedVarNames: function(vars){
vars = vars || this.varBindings
var ret = []
for (var varname in vars){
if (vars.hasOwnProperty(varname) && /^(eVar[0-9]+)|(prop[0-9]+)|(hier[0-9]+)|campaign|purchaseID|channel|server|state|zip|pageType$/.test(varname))
ret.push(varname)
}
return ret
},
$trackPageView: function(elm, evt, params){
var vars = params && params.setVars
var events = (params && params.addEvent) || []
var s = this.getS(null, {
setVars: vars,
addEvent: events
})
if (!s){
SL.notify('Adobe Analytics: page code not loaded', 1)
return
}
s.linkTrackVars = ''
s.linkTrackEvents = ''
this.executeCustomSetupFuns(s)
if (params && params.customSetup){
params.customSetup.call(elm, evt, s)
}
s.t()
this.clearVarBindings()
this.clearCustomSetup()
SL.notify("Adobe Analytics: tracked page view", 1)
},
$postTransaction: function(elm, evt, varname){
var trans = SL.data.transaction = window[varname]
, s = this.varBindings
, mapping = this.settings.fieldVarMapping
SL.each(trans.items, function(item){
this.products.push(item)
}, this)
s.products = SL.map(this.products, function(item){
var vars = []
if (mapping && mapping.item){
for (var field in mapping.item){
if (mapping.item.hasOwnProperty(field)) {
var varname = mapping.item[field]
vars.push(varname + '=' + item[field])
if (varname.substring(0, 5) === 'event')
this.events.push(varname)
}
}
}
var arr = ['', item.product, item.quantity, item.unitPrice * item.quantity]
if (vars.length > 0)
arr.push(vars.join('|'))
return arr.join(';')
}, this).join(',')
if (mapping && mapping.transaction){
// Add top-level events/eVars to products string.
var topLevelVars = []
for (var field in mapping.transaction){
if (mapping.transaction.hasOwnProperty(field)) {
var varname = mapping.transaction[field]
topLevelVars.push(varname + '=' + trans[field])
if (varname.substring(0, 5) === 'event')
this.events.push(varname)
}
}
if (s.products.length > 0)
s.products += ','
s.products += ';;;;' + topLevelVars.join('|')
}
},
$addEvent: function(elm, evt){
for (var i = 2, len = arguments.length; i < len; i++){
this.events.push(arguments[i])
}
},
$addProduct: function(elm, evt){
for (var i = 2, len = arguments.length; i < len; i++){
this.products.push(arguments[i])
}
}
})
SL.availableTools.sc = SiteCatalystTool
// The Default Tool
// ================
//
// The default tool comes with several handy utilities.
function DefaultTool(){
SL.BaseTool.call(this)
this.asyncScriptCallbackQueue = []
this.argsForBlockingScripts = []
}
SL.inherit(DefaultTool, SL.BaseTool)
SL.extend(DefaultTool.prototype, {
name: 'Default',
// `loadIframe(src, variables)`
// ----------------------------
//
// Dynamically create an iframe to load a URL.
//
// - src - the URL to load
// - variables - an object literal of which the key/value pairs will be used
// to create the query string to use in the src URL
$loadIframe: function(elm, evt, options){
var pages = options.pages
, loadOn = options.loadOn
var doit = SL.bind(function(){
SL.each(pages, function(page){
this.loadIframe(elm, evt, page)
}, this)
}, this)
if (!loadOn) doit()
if (loadOn === 'domready') SL.domReady(doit)
if (loadOn === 'load') SL.addEventHandler(window, 'load', doit)
},
loadIframe: function(elm, evt, page){
var iframe = document.createElement('iframe')
iframe.style.display = 'none'
var host = SL.data.host
, data = page.data
, src = this.scriptURL(page.src)
, search = SL.searchVariables(data, elm, evt)
if (host)
src = SL.basePath() + src
src += search
iframe.src = src
var body = document.getElementsByTagName('body')[0]
if (body)
body.appendChild(iframe)
else
SL.domReady(function(){
document.getElementsByTagName('body')[0].appendChild(iframe)
})
},
scriptURL: function(url){
var scriptDir = SL.settings.scriptDir || ''
return scriptDir + url
},
// `loadScript(options)
// ------------------------------
//
// Load any number of Javascript files using dynamically generated script tags.
// If you provide multiple file URLs, they will be loaded sequentially.
$loadScript: function(elm, evt, options){
var scripts = options.scripts
, sequential = options.sequential
, loadOn = options.loadOn
var doit = SL.bind(function(){
if (sequential){
this.loadScripts(elm, evt, scripts)
}else{
SL.each(scripts, function(script){
this.loadScripts(elm, evt, [script])
}, this)
}
}, this)
if (!loadOn) doit()
else if (loadOn === 'domready') SL.domReady(doit)
else if (loadOn === 'load') SL.addEventHandler(window, 'load', doit)
},
loadScripts: function(elm, evt, scripts) {
try{
var scripts = scripts.slice(0)
, q = this.asyncScriptCallbackQueue
, lastScript
, target = evt.target || evt.srcElement
, self = this
}catch(e){
console.error('scripts is', SL.stringify(scripts))
}
function loadNext(){
if (q.length > 0 && lastScript){
var callback = q.shift()
callback.call(elm, evt, target)
}
var script = scripts.shift()
if (script){
var host = SL.data.host
, src = self.scriptURL(script.src)
if (host)
src = SL.basePath() + src
lastScript = script
SL.loadScript(src, loadNext)
}
}
loadNext()
},
$loadBlockingScript: function(elm, evt, options){
var scripts = options.scripts
, loadOn = options.loadOn
var doit = SL.bind(function(){
SL.each(scripts, function(script){
this.loadBlockingScript(elm, evt, script)
}, this)
}, this)
//if (!loadOn || loadOn === evt.type) doit()
doit()
},
loadBlockingScript: function(elm, evt, script){
/*jshint evil:true */
var src = this.scriptURL(script.src)
, host = SL.data.host
, target = evt.target || evt.srcElement
if (host)
src = SL.basePath() + src
this.argsForBlockingScripts.push([elm, evt, target])
SL.loadScriptSync(src)
},
pushAsyncScript: function(callback){
this.asyncScriptCallbackQueue.push(callback)
},
pushBlockingScript: function(callback){
var args = this.argsForBlockingScripts.shift()
var element = args[0]
callback.apply(element, args.slice(1))
},
// `writeHTML(html)`
// -----------------
//
// Write an HTML fragment onto the page using `document.write()`.
//
// - `html` - the HTML fragment
$writeHTML: SL.escapeHtmlParams(function(elm, evt){
/*jshint evil:true */
if (SL.domReadyFired || !document.write){
SL.notify('Command writeHTML failed. You should try appending HTML using the async option.', 1)
return
}
if (evt.type !== 'pagebottom' && evt.type !== 'pagetop'){
SL.notify('You can only use writeHTML on the `pagetop` and `pagebottom` events.', 1)
return
}
for (var i = 2, len = arguments.length; i < len; i++){
var html = arguments[i].html
html = SL.replace(html, elm, evt)
document.write(html)
}
}),
linkNeedsDelayActivate: function(a, win){
win = win || window
var tagName = a.tagName
, target = a.getAttribute('target')
, location = a.getAttribute('href')
if (tagName && tagName.toLowerCase() !== 'a')
return false
if (!location)
return false
else if (!target)
return true
else if (target === '_blank')
return false
else if (target === '_top')
return win.top === win
else if (target === '_parent')
return false
else if (target === '_self')
return true
else if (win.name)
return target === win.name
else
return true
},
// `delayActivateLink()`
// ---------------------
//
// Delay the activation of an anchor link by first using `evt.preventDefault()` on
// the click event, and then setting the window location to the destination after
// a small delay. The default delay is 100 milliseconds, which can be configured in
// `_satellite.settings.linkDelay`
$delayActivateLink: function(elm, evt){
if (!this.linkNeedsDelayActivate(elm)) return
SL.preventDefault(evt)
var linkDelay = SL.settings.linkDelay || 100
setTimeout(function(){
SL.setLocation(elm.href)
}, linkDelay)
},
isQueueable: function(trig){
return trig.command !== 'writeHTML'
}
})
SL.availableTools['default'] = DefaultTool
// Basic Tool
// ------------
//
// This is a generic tool that allows integrating with
// various simple tools.
//
function BasicTool(settings){
SL.BaseTool.call(this, settings)
this.name = settings.name || 'Basic'
}
SL.inherit(BasicTool, SL.BaseTool)
SL.extend(BasicTool.prototype, {
initialize: function(){
var settings = this.settings
if (this.settings.initTool !== false){
var url = settings.url
if (typeof url === 'string'){
url = SL.basePath() + url
}else{
url = SL.isHttps() ? url.https : url.http
}
SL.loadScript(url, SL.bind(this.onLoad, this))
this.initializing = true
}else{
this.initialized = true
}
},
isQueueAvailable: function(){
return !this.initialized
},
onLoad: function(){
this.initialized = true
this.initializing = false
if (this.settings.initialBeacon){
this.settings.initialBeacon()
}
this.flushQueue()
},
endPLPhase: function(pageLoadEvent){
var loadOn = this.settings.loadOn
if (pageLoadEvent === loadOn){
SL.notify(this.name + ': Initializing at ' + pageLoadEvent, 1)
this.initialize()
}
},
$fire: function(elm, evt, fun){
if (this.initializing){
this.queueCommand({
command: 'fire',
arguments: [fun]
}, elm, evt)
return
}
fun.call(this.settings, elm, evt)
}
})
SL.availableTools.am = BasicTool
SL.availableTools.adlens = BasicTool
SL.availableTools.aem = BasicTool
SL.availableTools.__basic = BasicTool
// The Marketing Cloud Visitor ID Service Tool
// ================
//
// This tool interacts with the [Visitor ID library](https://git.corp.adobe.com/mc-visitor/VisitorAPI/tree/master/js/src).
// The tool initilizes the Visitor ID library as soon as the tool itself is
// created, by calling the `initialize` method. Find out more info about the
// initializing sequence by clicking [here](#-initialize-).
//
// The tool accepts the following settings:
//
// - `mcOrgId` - The Adobe Marketing Cloud Organization ID (Required)
// - `initVars` - Map containing properties that can be set on the Visitor ID
// instance. The following keys can be set here:
// * `trackingServer`,
// * `trackingServerSecure`,
// * `marketingCloudServer`
// * `marketingCloudServerSecure`
// - `customerIDs` - Map containing Customer IDs values that will be set on the
// instance
// - `autoRequest` - Flag that will read the Marketing Cloud Visitor ID by
// calling `getMarketingCloudVisitorID` method
function VisitorIdTool(settings) {
SL.BaseTool.call(this, settings);
this.name = settings.name || 'VisitorID';
this.initialize();
}
SL.extend(VisitorIdTool.prototype, {
// Public
// ------------------------------------------------
//
// `getInstance()`
// ------------------------------------------------
//
// Returns the Visitor ID instance that was created when the tool was
// initialized.
getInstance: function() {
return this.instance;
},
// Private
// ------------------------------------------------
//
// `initialize()`
// ------------------------------------------------
//
// The method creates a Visitor ID instance if all the data provided is valid.
// The instance will contain all the keys defined in the `initVar` setting.
// Any `dataElement` present as a value in the initVars map will be replaced
// with the correct value.
//
// It applies then a the map of Customer IDs by calling the `setCustomerIDs`
// method from the newly created instance. Any `dataElement` present as a
// value in the Customer IDs map will be replaced with the correct value.
//
// After that, the `getMarketingCloudVisitorID` method from the newly created
// instance is called, provided that the `autoRequest` settings is set to true.
initialize: function() {
var settings = this.settings, visitor;
SL.notify('Visitor ID: Initializing tool', 1);
visitor = this.createInstance(
settings.mcOrgId,
settings.initVars
);
if (visitor === null) {
return;
}
if (settings.customerIDs) {
this.applyCustomerIDs(visitor, settings.customerIDs);
}
if (settings.autoRequest) {
visitor.getMarketingCloudVisitorID();
}
this.instance = visitor;
},
createInstance: function(mcOrgId, initVars) {
if(!SL.isString(mcOrgId)) {
SL.notify(
'Visitor ID: Cannot create instance using mcOrgId: "' + mcOrgId + '"', 4);
return null;
}
mcOrgId = SL.replace(mcOrgId);
SL.notify(
'Visitor ID: Create instance using mcOrgId: "' + mcOrgId + '"', 1);
initVars = this.parseValues(initVars);
var instance = Visitor.getInstance(mcOrgId, initVars);
SL.notify('Visitor ID: Set variables: ' + SL.stringify(initVars), 1);
return instance;
},
applyCustomerIDs: function(instance, ids) {
var parsedIds = this.parseIds(ids);
instance.setCustomerIDs(parsedIds);
SL.notify('Visitor ID: Set Customer IDs: ' + SL.stringify(parsedIds), 1);
},
parseValues: function(hash) {
if (SL.isObject(hash) === false) {
return {};
}
var obj = {};
for (var v in hash) {
if (hash.hasOwnProperty(v)) {
obj[v] = SL.replace(hash[v]);
}
}
return obj;
},
parseIds: function(hash) {
var parsedIds = {};
if (SL.isObject(hash) === false) {
return {};
}
for (var v in hash) {
if (hash.hasOwnProperty(v)) {
var id = SL.replace(hash[v]['id']);
// All IDs should be data elements. If no replacement has taken place,
// then we can conclude that the data element doesn't exists.
// Also we should ignore existing data elements that are empty.
if (id !== hash[v]['id'] && id) {
parsedIds[v] = {};
parsedIds[v]['id'] = id;
parsedIds[v]['authState'] = Visitor.AuthState[hash[v]['authState']];
}
}
}
return parsedIds;
}
});
SL.availableTools.visitor_id = VisitorIdTool;
var GAUtils = {
allowLinker: function() {
return SL.hasMultipleDomains();
},
cookieDomain: function() {
var domainList = SL.settings.domainList;
var domainName = SL.find(domainList, function(domain) {
var hostname = window.location.hostname;
return SL.equalsIgnoreCase(
hostname.slice(hostname.length - domain.length),
domain);
});
var cookieDomain = domainName ? ('.' + domainName) : 'auto';
return cookieDomain;
}
};
// The Google Analytics Universal Tool
// ================
//
// This tool interacts with the [GAU library](https://developers.google.com/analytics/devguides/collection/analyticsjs/).
//
// From a high end perspective the following steps will happen. A `ga` dummy
// object will be initialized. Until the `analytics.js` file will be loaded in
// the browser, any triggered command will be queued in the `ga` object. Once
// the `analytics.js` will finish to load, all the queued commands will be
// executed.
//
// The tool is initialized during one of the following page load phases:
// top, bottom. Find out more info about the initializing sequence by clicking
// [here](#-endplphase-).
//
// Data elements are replaced when the tracker is created and on the commands
// from `initCommands` array. For the other situations, the data elements are
// replaced in the `triggerCommand` method from BaseTool.
//
// Beside the settings that are processed by the BaseTool code, this tool uses
// the following extra settings:
//
// - `engine` - The engine identifier (ga_universal)
// - `loadOn` - The PL phase when this tool will be initialized (top | bottom)
// - `url` - Custom URL of the `analytics.js` URL location. If none is provided
// the Google default URL will be used.
// - `initTool` - Boolean flag that can suppress the tool initialization phase.
// When set to `false` no JS library will be loaded and no initial command
// will be executed. All the later commands triggered by this tool will
// piggy back on any availble `ga` function from the page.
// - `trackerSettings` - Object containing properties that will be added on the
// command that will create the GAU tracker. For a list of all supported
// properties please click [here](https://developers.google.com/analytics/devguides/collection/analyticsjs/field-reference#create)
// - `initCommands` - It's an array containing commands. A command example:
// `["set", "anonymizeIp", true]`. For a list of all supported commands
// please click [here](https://developers.google.com/analytics/devguides/collection/analyticsjs/method-reference#tracker)
// The commands defined here will be executed after the tracker is created.
// - `allowLinker` - Flag that will make the GAU library load the cross domain
// linking plugin.
// - `customInit` - JS code that will be executed immediately after the tool is
// initialized. The boolean result from `customInit` will affect the
// initial page view call.
function GAUniversalTool(settings) {
SL.BaseTool.call(this, settings)
}
SL.inherit(GAUniversalTool, SL.BaseTool);
SL.extend(GAUniversalTool.prototype, {
// Public
// ------------------------------------------------
name: 'GAUniversal',
// `endPLPhase()`
// ------------------------------------------------
//
// Method that starts the tool initialization when the page load phase is
// matched and only if the tool initialization has not been previously
// cancelled. Find out more info about the initializing sequence by clicking
// [here](#-initialize-).
//
// After the tool is initialized a page view call is triggered if
// `suppressInitialPageView` flag is not set to `true`.
endPLPhase: function(pageLoadEvent) {
var settings = this.settings;
var loadOn = settings.loadOn;
if (pageLoadEvent === loadOn) {
SL.notify('GAU: Initializing at ' + pageLoadEvent, 1);
this.initialize();
this.flushQueue();
this.trackInitialPageView();
}
},
// `getTrackerName()`
// ------------------------------------------------
//
// Returns the name of the GA tracker initialized by this tool.
getTrackerName: function () {
return this.settings.trackerSettings.name || '';
},
// Private
// ------------------------------------------------
isPageCodeLoadSuppressed: function() {
return this.settings.initTool === false || this._cancelToolInit === true;
},
// `initialize()`
// ------------------------------------------------
//
// The method first creates the GA scaffolding objects (the `ga` object and
// the `GoogleAnalyticsObject` object.
//
// Then it loads the `analytics.js` library and append the command that will
// create the GAU tracker object to the `ga` object.
//
// Next, the commands from the `initCommands` array will be appended to
// the `ga` object. Finally the JS code defined in the `customInit` setting
// variable will be called.
initialize: function() {
if (this.isPageCodeLoadSuppressed()) {
this.initialized = true;
SL.notify('GAU: Page code not loaded (suppressed).', 1);
return;
}
var gaName = 'ga';
window[gaName] = window[gaName] || this.createGAObject();
window.GoogleAnalyticsObject = gaName;
SL.notify('GAU: Page code loaded.', 1);
SL.loadScriptOnce(this.getToolUrl());
var settings = this.settings;
if (GAUtils.allowLinker() && settings.allowLinker !== false) {
this.createAccountForLinker();
} else {
this.createAccount();
}
this.executeInitCommands();
if (settings.customInit){
var customInit = settings.customInit
var result = customInit(window[gaName], this.getTrackerName())
if (result === false){
this.suppressInitialPageView = true;
}
}
this.initialized = true;
},
createGAObject: function() {
var ga = function() {
ga.q.push(arguments);
};
ga.q = [];
ga.l = 1 * new Date();
return ga;
},
createAccount: function() {
this.create();
},
createAccountForLinker: function() {
var options = {};
if (GAUtils.allowLinker())
options.allowLinker = true;
this.create(options);
this.call('require', 'linker');
this.call('linker:autoLink', this.autoLinkDomains(), false, true);
},
create: function(extra){
var options = this.settings.trackerSettings;
options =
SL.preprocessArguments([options], location, null, this.forceLowerCase)[0];
options.trackingId =
SL.replace(this.settings.trackerSettings.trackingId, location);
if (!options.cookieDomain) {
options.cookieDomain = GAUtils.cookieDomain();
}
SL.extend(options, extra || {});
this.call('create', options);
},
autoLinkDomains: function() {
var ourDomain = location.hostname;
return SL.filter(SL.settings.domainList, function(domain) {
return domain !== ourDomain;
});
},
executeInitCommands: function() {
var settings = this.settings;
if (settings.initCommands) {
SL.each(settings.initCommands, function(command) {
var args = command.splice(2, command.length - 2);
command = command.concat(
SL.preprocessArguments(args, location, null, this.forceLowerCase)
);
this.call.apply(this, command);
}, this);
}
},
trackInitialPageView: function(){
if (this.suppressInitialPageView || this.isPageCodeLoadSuppressed()) {
return;
}
this.call('send', 'pageview');
},
call: function() {
if (typeof ga !== 'function') {
SL.notify('GA Universal function not found!', 4);
return;
}
if (this.isCallSuppressed()) {
return;
}
arguments[0] = this.cmd(arguments[0]);
this.log(SL.toArray(arguments));
ga.apply(window, arguments);
},
isCallSuppressed: function() {
return this._cancelToolInit === true;
},
$missing$: function(command, elm, evt, args) {
args = args || [];
args = [command].concat(args);
this.call.apply(this, args);
},
getToolUrl: function() {
var settings = this.settings;
var isHttps = SL.isHttps();
if (settings.url) {
return isHttps ? settings.url.https : settings.url.http;
}
return (isHttps ? 'https://ssl' : 'http://www') + '.google-analytics.com/analytics.js';
},
cmd: function(command) {
var trackerCommands = ['send', 'set', 'get'];
var trackerName = this.getTrackerName();
if (!trackerName || SL.indexOf(trackerCommands, command) === -1) {
return command;
}
return trackerName + '.' + command;
},
log: function(args) {
var cmd = args[0];
var tracker = this.getTrackerName() || 'default';
var msg = 'GA Universal: sent command ' + cmd + ' to tracker ' + tracker;
if (args.length > 1) {
var parameters = SL.stringify(args.slice(1));
msg += ' with parameters ' + SL.stringify(args.slice(1));
}
msg += '.';
SL.notify(msg, 1);
}
});
SL.availableTools.ga_universal = GAUniversalTool;
// Google Analytics Tool
// ---------------------
//
// The GATool allows you to use any Google Analytics command.
// Example:
//
// trigger: [
// {
// tool: "ga",
// command: "trackEvent",
// arguments: [
// "video",
// "video 10% complete"
// ]
// }
// ]
//
// This trigger will call the `trackEvent` method, which is equivalent to
//
// _gaq.push(['_trackEvent', 'video', 'video 10% complete'])
function GATool(settings){
SL.BaseTool.call(this, settings)
}
SL.inherit(GATool, SL.BaseTool)
SL.extend(GATool.prototype, {
name: 'GA',
initialize: function(){
var settings = this.settings
var before = window._gaq
, initCommands = settings.initCommands || []
, customInit = settings.customInit
if (!before){
// And yes, I *do* mean to set a global variable
// of `_gaq` here
_gaq = []
}
if (!this.isSuppressed()){
if (!before && !GATool.scriptLoaded){
var https = SL.isHttps()
var url =
(https ? 'https://ssl' : 'http://www') +
'.google-analytics.com/ga.js'
if (settings.url){
url = https ? settings.url.https : settings.url.http
}
SL.loadScript(url)
GATool.scriptLoaded = true
SL.notify('GA: page code loaded.', 1)
}
var domain = settings.domain
, trackerName = settings.trackerName
, allowLinker = GAUtils.allowLinker()
, account = SL.replace(settings.account, location)
, domainList = SL.settings.domainList || []
_gaq.push([this.cmd('setAccount'), account])
if (allowLinker)
_gaq.push([this.cmd('setAllowLinker'), allowLinker])
_gaq.push([this.cmd('setDomainName'), GAUtils.cookieDomain()])
SL.each(initCommands, function(cmd){
var arr = [this.cmd(cmd[0])].concat(SL.preprocessArguments(cmd.slice(1), location, null, this.forceLowerCase))
_gaq.push(arr)
}, this)
if (customInit)
this.suppressInitialPageView = false === customInit(_gaq, trackerName)
if (settings.pageName)
this.$overrideInitialPageView(null, null, settings.pageName)
}else{
SL.notify('GA: page code not loaded(suppressed).', 1)
}
this.initialized = true
SL.fireEvent(this.id + '.configure', _gaq, trackerName)
},
isSuppressed: function(){
return this._cancelToolInit || this.settings.initTool === false
},
tracker: function(){
return this.settings.trackerName
},
cmd: function(cmd){
var tracker = this.tracker()
return tracker ? tracker + '._' + cmd : '_' + cmd
},
$overrideInitialPageView: function(elm, evt, url){
this.urlOverride = url
},
trackInitialPageView: function(){
if (this.isSuppressed()) return
if (this.suppressInitialPageView) return
if (this.urlOverride){
var args = SL.preprocessArguments([this.urlOverride], location, null, this.forceLowerCase)
this.$missing$('trackPageview', null, null, args)
}else{
this.$missing$('trackPageview')
}
},
endPLPhase: function(pageLoadEvent){
var loadOn = this.settings.loadOn
if (pageLoadEvent === loadOn){
SL.notify('GA: Initializing at ' + pageLoadEvent, 1)
this.initialize()
this.flushQueue()
this.trackInitialPageView()
}
},
call: function(cmd, elm, evt, args){
if (this._cancelToolInit) return
var settings = this.settings
, tracker = this.tracker()
, fullCmd = this.cmd(cmd)
, args = args ? [fullCmd].concat(args) : [fullCmd]
_gaq.push(args)
if (tracker)
SL.notify("GA: sent command " + cmd + " to tracker " + tracker +
(args.length > 1 ?
" with parameters [" + args.slice(1).join(', ') + "]" :
'') + ".", 1)
else
SL.notify("GA: sent command " + cmd +
(args.length > 1 ?
" with parameters [" + args.slice(1).join(', ') + "]":
'') + ".", 1)
},
$missing$: function(cmd, elm, evt, args){
this.call(cmd, elm, evt, args)
},
// individual command methods
$postTransaction: function(elm, evt, varname){
var trans = SL.data.customVars.transaction = window[varname]
this.call('addTrans', elm, evt, [
trans.orderID,
trans.affiliation,
trans.total,
trans.tax,
trans.shipping,
trans.city,
trans.state,
trans.country
])
SL.each(trans.items, function(item){
this.call('addItem', elm, evt, [
item.orderID,
item.sku,
item.product,
item.category,
item.unitPrice,
item.quantity
])
}, this)
this.call('trackTrans', elm, evt)
},
delayLink: function(elm, evt){
var ga = this
if (!GAUtils.allowLinker()) return
if (!elm.hostname.match(this.settings.linkerDomains)) return
if (SL.isSubdomainOf(elm.hostname, location.hostname)) return
SL.preventDefault(evt)
var linkDelay = SL.settings.linkDelay || 100
setTimeout(function(){
ga.call('link', elm, evt, [elm.href])
}, linkDelay)
},
popupLink: function(elm, evt){
if (!window._gat) return
SL.preventDefault(evt)
var account = this.settings.account
var tracker = window._gat._createTracker(account)
var url = tracker._getLinkerUrl(elm.href)
window.open(url)
},
$link: function(elm, evt){
if (elm.getAttribute('target') === '_blank'){
this.popupLink(elm, evt)
}else{
this.delayLink(elm, evt)
}
},
$trackEvent: function(elm, evt){
var args = Array.prototype.slice.call(arguments, 2)
if (args.length >= 4 && args[3] != null){
// acertain that the 4th element is a number, falling back to 1
var value = parseInt(args[3], 10)
if (SL.isNaN(value)){
value = 1
}
args[3] = value
}
this.call('trackEvent', elm, evt, args)
}
})
SL.availableTools.ga = GATool
_satellite.init({
"tools": {
"21d4da84002970ac77af10cdabc32f20": {
"engine": "sc",
"loadOn": "pagebottom",
"account": "clgbcollegeboardcomprod",
"euCookie": false,
"sCodeURL": "7a8a98de0363fbed05b98da851d6b23866ffa7cc/s-code-contents-55dc9cec4faa6cdfed0976f767868b7bcd08c911.js",
"initVars": {
"charSet": "UTF-8",
"currencyCode": "USD",
"trackingServer": "track.collegeboard.org",
"trackingServerSecure": "strack.collegeboard.org",
"trackInlineStats": true,
"trackDownloadLinks": false,
"trackExternalLinks": false,
"linkLeaveQueryString": false,
"dynamicVariablePrefix": "D="
},
"customInit": function(s){
/* global Visitor, SatReg */
/**
* Configured by jbeach on 2016-07-20
* Updated by jbeach on 2020-07-08
*/
kiwi = window.kiwi || {};
kiwi.util = kiwi.util || _satellite.getVar('Kiwi Utility Functions') || {};
var ruleName='KIWI: Tool > Analytics > Custom JS';
/********************* Global Vars Init SECTION *********************/
//_satellite.notify(ruleName+' > Global Vars Section');
// DDL
digitalData = window.digitalData || {};
digitalData.page = digitalData.page || {};
digitalData.page.pageInfo = digitalData.page.pageInfo || {};
digitalData.page.category = digitalData.page.category || {};
digitalData.page.attributes = digitalData.page.attributes || {};
digitalData.page.attributes.targetModsComplete = digitalData.page.attributes.targetModsComplete || 0;
digitalData.user = digitalData.user || [ {profile: {} } ];
// CB Track Data
cbTrackData = window.cbTrackData || {};
/************************** CONFIGURATIONS SECTION ***************/
//_satellite.notify('KIWI: Tool > Analytics > Custom JS > CONFIGURATIONS SECTION');
s.usePlugins=true;
s.visitor = Visitor.getInstance('5E1B123F5245B29B0A490D45@AdobeOrg');
s.linkDownloadFileTypes='.arf,.avi,.css,.csv,.dmg,.doc,.docx,.dotx,.eps,.exe,.ics,.js,.m4v,.mov,.mp3,.mp4,.mpg,.pages,.pdf,.ppt,.pptx,.rar,.rm,.rtf,.swf,.tab,.txt,.vsd,.vxd,.wav,.wma,.wmv,.xls,.xlsx,.xml,.zip';
s.linkInternalFilters='javascript:,acquia-sites.com,apscore.org,cbapis.org,collegeboard.com,collegeboard.org,springboardonline.com,springboardonline.org';
s.ActionDepthTest=true; // Depth1: Landing Page and Depth2: Second Page Events
/* Time Parting Config */
//time parting configuration
//US
s._tpDST = {
2012:'3/11,11/4',
2013:'3/10,11/3',
2014:'3/9,11/2',
2015:'3/8,11/1',
2016:'3/13,11/6',
2017:'3/12,11/5',
2018:'3/11,11/4',
2019:'3/10,11/3',
2020:'3/8,11/1',
2021:'3/14,11/7',
2022:'3/13,11/6',
2023:'3/12,11/5'};
/* end Time Parting Config */
/** end Configurations Section **/
/*********Media Module Calls**************/
/***** MEDIA MODULE CONFIGURATION FOR MILESTONE TRACKING START*****/
s.loadModule('Media');
s.Media.onLoad = function(s) {
s.Media.autoTrack= false;
/*Track Milestone 10%, 25%, 50%, 75%, 95%
* Delete unwanted milestone if necessary
*/
s.Media.trackMilestones='25,50,75,100'; //10,25,50,75,95
s.Media.playerName='default-video-player-name'; //_satellite.getVar('Video Player Name') || ;
s.Media.segmentByMilestones = true;
s.Media.trackUsingContextData = true;
/* Add reserved context data variables as needed to populate default metrics
* a.media.progress10, a.media.progress25, a.media.progress50 ,a.media.progress75, a.media.progress95
* a.media.friendlyname --> to populate Video Name report
*/
s.Media.trackVars='contextData.a.media.progress10,contextData.a.media.progress25,contextData.a.media.progress50,contextData.a.media.progress75,contextData.a.media.progress95,contextData.a.media.friendlyname';
};
/*
* USE MEDIA MONITOR TO SEND THE ADDITIONAL a.media.progressXX variables: needed as no processing rules are created by default to handle media.milestone
*/
s.Media.monitor = function (s,media) {
//Reset Variables
s.contextData['a.media.progress10'] = s.contextData['a.media.progress25'] = s.contextData['a.media.progress50'] = s.contextData['a.media.progress75'] = s.contextData['a.media.progress95'] = s.contextData['a.media.friendlyname'] = '';
s.contextData['a.media.friendlyname'] = _satellite.getVar('Video Media Name'); //assign custom friendly name if needed
//if no custom friendly name
if(!s.contextData['a.media.friendlyname']){
//default to media.name
s.contextData['a.media.friendlyname'] = media.name;
}
//If MILESTONE EVENT
if(media.event=='MILESTONE') {
//Check which milestone has been reached: media.milestone
switch (media.milestone) {
case 10:
//When the 10% milestone is reached add a.media.progress10 to the Adobe Analytics request
s.contextData['a.media.progress10'] = true;
s.Media.track(media.name);
break;
case 25:
//When the 25% milestone is reached add a.media.progress25 to the Adobe Analytics request
s.contextData['a.media.progress25'] = true;
s.Media.track(media.name);
break;
case 50:
//When the 50% milestone is reached add a.media.progress50 to the Adobe Analytics request
s.contextData['a.media.progress50'] = true;
s.Media.track(media.name);
break;
case 75:
//When the 75% milestone is reached add a.media.progress75 to the Adobe Analytics request
s.contextData['a.media.progress75'] = true;
s.Media.track(media.name);
break;
case 95:
//When the 95% milestone is reached add a.media.progress95 to the Adobe Analytics request
s.contextData['a.media.progress95'] = true;
s.Media.track(media.name);
break;
default:
//When any other % milestone is reached do nothing
break;
}
}
};
/***** MEDIA MODULE CONFIGURATION FOR MILESTONE TRACKING END*****/
/*********end Media Module Calls**************/
/************************** DO PLUGINS SECTION ***********************/
s.doPlugins=function(s) {
//_satellite.notify('KIWI: Tool > Analytics > Custom JS > DO PLUGINS SECTION (begin)');
//track times through do plugins
if (typeof kiwi._timesThruDoPlugins != 'undefined') kiwi._timesThruDoPlugins++;
else kiwi._timesThruDoPlugins = 0;
_satellite.notify('KIWI: Tool > Analytics > Custom JS > kiwi._timesThruDoPlugins = '+ kiwi._timesThruDoPlugins.toString());
//start fresh
s.clearVars();
s.linkTrackVars = 'channel,server,prop1,prop5,prop6,prop7,prop9,prop11,prop12,prop13,prop14,prop17,prop18,prop19,prop20,prop21,' +
'prop25,prop32,prop57,prop59,eVar5,eVar8,eVar17,eVar21,eVar22,eVar23,eVar24,eVar25,eVar67'; //send with all link tracking TODO: prop50,prop51
s.linkTrackEvents = '';
/* Legacy Analytics Overrides */
var ruleName='KIWI: Tool > Analytics > Custom JS > Legacy Analytics Overrides > NSAT';
if (kiwi._thisPage.siteCode == 'nsat') {
_satellite.notify(ruleName);
/* NSAT analytics overrides */
if ((!cbTrackData.flowCode && !cbTrackData.pageCode) ||
(cbTrackData.pageCode.match(/(satprofile:coursework[1-6]|:confirmationpopup|:printadmissionticket)/i))) {
var s_pageName = _satellite.getVar('SCode Page Name');
if(s_pageName) {
if (s_pageName.match(/:/i)) {
//parse it
var arr_s_pageName = s_pageName.split(':');
cbTrackData.flowCode = arr_s_pageName[0];
cbTrackData.pageCode = arr_s_pageName[1];
}
}
}
// NSAT Page Name fixing HACKERY :(, 8/21/2017
var my_pageName = s_pageName || cbTrackData.flowCode + ':' +cbTrackData.pageCode,
hack_pageName = '',
my_prevPage = decodeURIComponent(_satellite.readCookie('gpv_pn'));
if (my_pageName == 'satregistration:photo-flash' && document.location.href.match(/\/managereg\//i)) {
hack_pageName = 'changesat:photo-flash';
}
if (my_pageName == 'satregistration:confirmationpopup') {
if (my_prevPage == 'satregistration:reviewpurchase') hack_pageName = 'satregistration:purchaseconfirmpopup';
else if (my_prevPage == 'scorechoice:satregrevieworderpage') hack_pageName = 'scorechoice:confirmpopup';
} else if (my_pageName == 'changesat:confirmationpopup' && my_prevPage == 'changesat:reviewpurchase') hack_pageName = 'changesat:purchaseconfirmpopup';
if (hack_pageName) {
_satellite.setVar('Page Name Override', hack_pageName);
my_pageName = hack_pageName;
}
//map pagenames to steps, set current flowsteps
var pageToStepsArray = [
['satregistration:getstarted', ['begin']],
['satregistration:getstarted-orf1', ['begin']],
['satregistration:reviewpersonalprofile', ['profile-pi']],
['satregistration:demographics', ['profile-dg']],
['satregistration:contractoptinpage', ['contract-optin']],
['satprofile:cbprograms', ['sdq-cbprograms']],
['satprofile:gparank', ['sdq-gparank']],
['satprofile:coursework1', ['sdq-cw-math']],
['satprofile:coursework2', ['sdq-cw-english']],
['satprofile:coursework3', ['sdq-cw-science']],
['satprofile:coursework4', ['sdq-cw-socialstudies']],
['satprofile:coursework5', ['sdq-cw-languages']],
['satprofile:coursework6', ['sdq-cw-artsmusic']],
['satprofile:hsactivities', ['sdq-hsactivities']],
['satprofile:collegeplans', ['sdq-collegeplans']],
['satregistration:termsandconditions', ['terms']],
['satregistration:choosetestanddate', ['choose-test']],
['satregistration:choosetestcenter', ['choose-center']],
['satregistration:photo-flash', ['photo']],
['satregistration:facebookphotopage', ['photo-facebook']],
['satregistration:crosssell', ['crosssell']],
['satregistration:reviewpurchase', ['purchase-review']],
['satregistration:purchaseconfirmpopup', ['purchase-accept']],
['satregistration:purchaseconfirmation', ['purchase-complete']],
['satregistration:revieworder', ['reg-review']],
['satregistration:confirmationpopup', ['reg-accept']],
['satregistration:confirmation', ['reg-complete']],
['satregistration:printadmissionticket', ['ticket']],
['changesat:changeregistration', ['change-begin']],
['changesat:reviewpersonalprofile', ['change-profile-pi']],
['changesat:choosetestanddate', ['change-test']],
['changesat:choosetestcenter', ['change-center']],
['changesat:photo-flash', ['change-photo']],
['changesat:crosssell', ['change-crosssell']],
['changesat:revieworder', ['change-review']],
['changesat:confirmationpopup', ['change-accept']],
['changesat:confirmationpage', ['change-complete']],
['changesat:printadmissionticket', ['change-ticket']]
];
//NOT ENOUGH BROWSER SUPPORT YET for "Map"
//var pageToStepsMap = new Map(pageToStepsArray);
//cbTrackData.flowSteps = pageToStepsMap.get(cbTrackData.pageCode);
for (var i = 0; i < pageToStepsArray.length; i++) {
var pageKey = pageToStepsArray[i][0],
arrSteps = pageToStepsArray[i][1];
if (pageKey == my_pageName) cbTrackData.flowSteps = arrSteps;
}
//get at SAT regNo
if (_satellite.getVar('SCode Events Data')) {
var arrSEvents = _satellite.getVar('SCode Events Data').split(',');
(function(){
for (var i = 0; i < arrSEvents.length; i++) {
if (arrSEvents[i].match(/event(2|71|72|73|74|75):/i)) {
cbTrackData.satRegNo = arrSEvents[i].split(':')[1];
if (cbTrackData.satRegNo == 'regNo' &&
typeof SatReg != 'undefined' &&
typeof SatReg.FtlVars != 'undefined' &&
typeof SatReg.FtlVars.regNo != 'undefined') cbTrackData.satRegNo = window.SatReg.FtlVars.regNo; //fixes bug in Print Ticket event tracking on Next Steps button
}
}
})();
}
//get at Test Type
if (cbTrackData.pageCode == 'choosetestcenter' && _satellite.getVar('DOM nsat TestTypeId')) {
// sat subject tests open info box ... OR sat open info box ... OR sat with essay open info box...
if (_satellite.getVar('DOM nsat TestTypeId').match(/sat subject tests/i)) {s.eVar26 = 'SAT Subject';}
else s.eVar26 = 'SAT';
}
/* end NSAT analytics overrides */
}
/* end Legacy Analytics Overrides */
/* Basic Var settings */
s.events = s.apl(s.events, 'event7', ',', 2); //Page View
s.hier1 = 'D=g';
s.prop58 = _satellite.getVar('protocol');
s.server = _satellite.getVar('Domain');
s.prop20 = _satellite.getVar('Subdomain');
s.prop32 = _satellite.getVar('Site Code');
cbTrackData.flowCode = _satellite.getVar('AppData Flow Code');
s.prop1 = 'D=pageName';
//s.pageName = _satellite.getVar('Page Name'); //Page
//Page Track Object
(function(oData){
s.prop8 = oData.source || 'undefined'; //Page Track Source
s.pageName = oData.pageName || _satellite.getVar('Page Name'); //Page
})(_satellite.getVar('Data - Page Track'));
s.prop1 = 'PAGE|'+s.pageName;
/*s.eVar87 = _satellite.getVar('Page Property - AP Classroom - Application ID'); //AP Classroom Page Application ID
s.eVar88 = _satellite.getVar('Page Property - AP Classroom - Student ID'); //AP Classroom Page Student ID
s.eVar89 = _satellite.getVar('Page Property - AP Classroom - Unit ID'); //AP Classroom Page Unit ID */
s.prop7 = _satellite.readCookie('gpv_c32') || ''; //Previous Site Code
s.prop52 = _satellite.readCookie('gpv_pn') || ''; //Previous Page
s.prop18 = s.getTimeParting('n', '-5'); //Hour of Day, Day of Week, Weekend/Weekday
s.eVar20 = s.getDaysSinceLastVisit('s_lastvisit'); //Days Since Last Visit
if (kiwi._pageLoadTime) {
s.events = s.apl(s.events, 'event86=' + kiwi._pageLoadTime, ',', 2); //Page Load Time
s.prop61 = kiwi._pageLoadTime; //Page Load Time
}
if (s.ActionDepthTest) {
s.pdvalue = s.getActionDepth('s_depth');
if (s.pdvalue == 1) {s.events = s.apl(s.events, 'event38', ',', 2);} // Depth1: Landing Page
if (s.pdvalue == 2) {s.events = s.apl(s.events, 'event39', ',', 2);} // Depth2: Second Page
}
s.ActionDepthTest = false;
//s.prop50 = _satellite.getVar('Kiwi MCIDS Present'); //MCIDS Present
//s.prop51 = _satellite.getVar('Kiwi MC Visitor ID'); //Marketing Cloud Visitor ID
s.prop6 = _satellite.getVar('Kiwi Version'); //Kiwi Version
s.prop35 = _satellite.getVar('Enterprise Widgets Version'); //Enterprise Widgets Version
s.prop36 = _satellite.getVar('Apricot Version'); //Apricot Version
s.prop57 = _satellite.getVar('DOM Browser Width'); //Browser Width
s.prop74 = _satellite.getVar('Report Load Speed'); //BI Report Load Speed
s.prop5 = _satellite.getVar('Derived Education Period Code'); //Education Period Code
s.eVar7 = _satellite.getVar('DDL - User - LIFW Status'); //LIFW Status
s.eVar8 = _satellite.getVar('AppData App User Org ID'); //App User Org ID (e.g. app-specific AI Code, DI Code)
s.prop19 = _satellite.getVar('DDL - User Role'); //App User Role
s.prop21 = _satellite.getVar('AppData App Pilot'); //'channels-20180103-01'; //App Pilot
s.prop14 = _satellite.getVar('AppData AP Student Grade Level'); //AP Student Grade Level
s.prop33 = _satellite.getVar('AppData AP Course ID'); //AP Course ID
s.prop39 = _satellite.getVar('AA - App Data Custom 1'); //App Data Custom 1
s.prop40 = _satellite.getVar('AA - App Data Custom 2'); //App Data Custom 2
s.prop41 = _satellite.getVar('AA - App Data Custom 3'); //App Data Custom 3
s.prop42 = _satellite.getVar('AA - App Data Custom 4'); //App Data Custom 4
//clear the App Data Custom vars
_satellite.setVar('AA - App Data Custom 1', '');
_satellite.setVar('AA - App Data Custom 2', '');
_satellite.setVar('AA - App Data Custom 3', '');
_satellite.setVar('AA - App Data Custom 4', '');
s.prop31 = _satellite.getVar('SKU');
s.prop70 = _satellite.getVar('AppData DI Code'); //DI Code
s.eVar67 = _satellite.getVar('Apricot - User Input Method'); //User Input Method
if (kiwi._thisPage.siteCode === 'hedr') {
s.prop70 = s.eVar8; //DI Code
s.prop71 = s.prop19; //HED Reporting App Role TODO: switch reports to use prop19 and disable prop71
}
if (kiwi._thisPage.siteCode === 'springboarddigital') {
s.prop62 = s.prop19; //Springboard Digital Audience TODO: switch reports to use prop19 and disable prop62
s.prop63 = _satellite.getVar('AppData User District'); //TODO: switch to "AppData App User Org ID"
}
if((_satellite.getVar('AppData User Type')=='a2o')) s.prop72 = 'a2o'; //A2O Segment //TODO: deprecate switch this to "AppData App User Role"
/* end Basic Var settings */
/* CB Web (IAM) */
kiwi.userIsLoggedIn = (_satellite.readCookie('cb_login')) || false;
/* CB Web Login Tracking */
(function(oData, sPageName) {
if (oData && oData.hasData) {
_satellite.notify('KIWI: Data - CB Web Data found: ' + JSON.stringify(oData));
if (oData.events) {
if (oData.events.match(/event(9|14|21)/i)) {
s.eVar19 = oData.appId || ''; // CB Application ID
}
if (oData.events.match(/event9/i) && !s.prop52.match(/(securitycheck-)/i)) {
if (oData.interim) {
s.events = s.apl(s.events, 'event198', ',', 2); //CB Web AP Interim Logins
//accommodate for when page after interim account create is reminder message, WAP-2908
if (sPageName.match(/^iam:/i)) {
s.events = s.apl(s.events, 'event197:' + oData.id, ',', 2); //CB Web AP Interim Registrations
}
} else {
s.events = s.apl(s.events, 'event9', ',', 2); //CB Web Logins
}
}
if (oData.events.match(/event14/i)) {
if (oData.interim) {
s.events = s.apl(s.events, 'event197:' + oData.id, ',', 2); //CB Web AP Interim Registrations
} else {
s.events = s.apl(s.events, 'event14:' + oData.id, ',', 2); //CB Web ECL Registrations
}
}
if (oData.events.match(/event21/i)) {
s.events = s.apl(s.events, 'event21:' + oData.id, ',', 2); //CB Web EPL Registrations
}
}
//accommodate for when WEP doesn't include event14/event197 but new account is created!
if (sPageName.match(/^(iam:registrationconfirmationpage|iam:interimaccount:create:success)-/i)) {
if (oData.interim) {
s.events = s.apl(s.events, 'event197:' + oData.id, ',', 2); //CB Web AP Interim Registrations
} else {
s.events = s.apl(s.events, 'event14:' + oData.id, ',', 2); //CB Web ECL Registrations
}
kiwi.util.fireCustomEvent('ECL Account Created');
}
//new prof account creation doesn't currently get event21 in WEP cookie! so we test for scode event21 next
var sEvents = _satellite.getVar('SCode Events Data');
if (sEvents.match(/event21/i)) {
s.events = s.apl(s.events, 'event21:' + oData.id, ',', 2); //CB Web EPL Registrations
}
//derive Interim Account Merge scenario (page name not currently working for this)
var iamPageClasses = _satellite.getVar('DOM - iam-page Node');
if (iamPageClasses.match(/(^| )iam-merged($| )/i)) {
s.events = s.apl(s.events, 'event199', ',', 2); //CB Web AP Interim Account Merges
}
s.linkTrackVars=s.apl(s.linkTrackVars, 'events', ',', 2);
//stop interim account events from firing on random Custom Links, e.g. on Big Future, WAP-2908, WAP2916
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event9,event14,event21', ',', 2);
//s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event9,event14,event21,event197,event198,event199', ',', 2);
//Expire WAP_EXTERNAL_PROPERTIES cookie after track
_satellite.notify('WAP_EXTERNAL_PROPERTIES='+ _satellite.getVar('IAM Cookie - WAP_EXTERNAL_PROPERTIES'))
document.cookie = 'WAP_EXTERNAL_PROPERTIES=;expires=-1;path=/ ;domain=collegeboard.org';
//update kiwi.user vals
kiwi.user = {
interim: oData.interim,
type: oData.type,
cbId: oData.id,
orgId: oData.orgId,
gender: oData.gender,
gradeLevel: oData.gradeLevel,
gradYear: oData.gradYear,
jobTitle: oData.jobTitle
};
//signal kiwi.cookie.user updates
kiwi._sessCookieMod = true;
kiwi.cookie.sess.user = kiwi.user;
}
})(_satellite.getVar('Data - CB Web Login'), _satellite.getVar('SCode Page Name'));
/* end CB Web Login Tracking */
/* CB Web Account Creation Custom Events */
//if (s.pageName.match(/^iam:registrationpage2-/i)) {}
/* end CB Web Account Creation Custom Events */
s.prop9 = _satellite.getVar('CB Web - Logged In State'); //CB Web Logged In State
s.eVar22 = _satellite.getVar('CB Web - Account Type'); //CB Web Account Type
s.eVar17 = _satellite.getVar('CB Web - Account ID'); //CB Web Account ID
s.eVar5 = _satellite.getVar('CB Web - Org ID'); //CB Web Org ID
s.eVar24 = _satellite.getVar('CB Web - Gender'); //CB Web Gender
s.eVar23 = _satellite.getVar('CB Web - Grad Year'); //CB Web Grad Year
s.eVar21 = _satellite.getVar('CB Web - Grade Level'); //CB Web Grade Level
s.eVar25 = _satellite.getVar('CB Web - Job Title Code'); //CB Web Job Title Code
//_satellite.notify('KIWI: CB Web Data tracked: ' + JSON.stringify(kiwi.user));
/* end CB Web (IAM) */
/* Special IAM Page Name */
var arrMatchCurr = s.pageName.match(/^iam:default:lockedout-(.*)$/i),
arrMatchPrev = s.prop52.match(/(login|securitycheck)/i);
if (arrMatchCurr !== null && arrMatchPrev !== null) {
s.pageName = 'iam:'+arrMatchPrev[1]+':lockedout-' + arrMatchCurr[1];
}
var arrMatchCurr = s.pageName.match(/^iam:login:error:password-(.*)$/i),
lockoutWarnModal = document.getElementById('lockout'),
pageModalOpen = document.querySelector('[iam-spa].modal-open');
if (arrMatchCurr !== null && lockoutWarnModal && pageModalOpen) {
s.pageName = 'iam:login:lockoutwarning-' + arrMatchCurr[1];
}
/* end Special IAM Page Name */
/* Error Page Tracking */
var result = s.pageName.match(/:(404errorpage|500errorpage|downpage|highvolume|403forbidden)/i);
if (result !== null) {
//s.pageName='';
//s.pageType='errorPage';
s.prop11 = 'server';
s.prop12 = result[1];
s.prop13 = 'D=g'; //URL Attempted
}
if (s.linkType === 'o') {
if (s.linkName == 'ajax error tracking') {
var oData = _satellite.getVar('Ajax Error Data');
if (oData) {
s.prop11 = oData.type;
s.prop12 = oData.code;
s.prop13 = 'D=pageName';
}
//reset data
_satellite.setVar('Ajax Error Data', '');
}
}
/* end Error Page Tracking */
/* App Error on Page */
(function(){
var warningAlertText = _satellite.getVar('DOM - Alert Text - Warning'),
dangerAlertText = _satellite.getVar('DOM - Alert Text - Danger');
if (dangerAlertText || warningAlertText) {
s.prop11 = 'on-page-alert';
s.prop12 = dangerAlertText?'on-page-alert (danger): '+dangerAlertText:'on-page-alert (warning): '+warningAlertText;
s.prop13 = 'D=pageName';
}
})();
/* end App Error on Page */
/* Legacy Internal Campaign Clicks */
//TODO: Deprecate after Target Late coming links tracking is fixed
var sIntCmp = _satellite.getVar('Legacy Internal Campaign Clicked');
if (sIntCmp) {
s.eVar2 = sIntCmp; //Internal Campaign Clicks (legacy)
s.eVar2 = s.getValOnce(s.eVar2, 's_v2', 30); //Internal Campaign Clicks (legacy), deduped
if (s.eVar2.length) {
//_satellite.notify('KIWI: Legacy Internal Campaign Tracked: ' + sIntCmp);
s.events = s.apl(s.events, 'event13', ',', 2); //Internal Campaign Clicks (legacy)
//reset appdata, cookie after track
//_satellite.setVar('Legacy Internal Campaign Clicked', '');
document.cookie = 'cb_intcmp=; expires=-1; path=/; domain=.collegeboard.org';
}
}
/* end Legacy Internal Campaign Clicks */
/* Promo/Nav Track Goals Setup */
kiwi._promoTrackGoals = kiwi._promoTrackGoals || '';
kiwi._navTrackGoals = kiwi._navTrackGoals || '';
//page load or click track via JS
if (s.linkType) {
//click track via JS - check link type
if (s.linkType === 'o' && (s.linkName === 'Widget Display Change')) {
//widget state change - collect promo views on widget
kiwi._promoTrackGoals = 'views';
kiwi._navTrackGoals = 'both';
_satellite.notify('KIWI: Promo/Nav Track Goals //widget state change - collect promo views on widget');
} else {
//check for nav/promo clicks
if (s.linkType === 'e' ||
s.linkType === 'd' ||
(s.linkType === 'o' && (s.linkName === 'Dynamic Download Link' ||
s.linkName.match(/Promo Link/i) ||
s.linkName === 'Nav Link' ||
s.linkName === 'Site Search Link'))) {
kiwi._promoTrackGoals = 'clicks';
kiwi._navTrackGoals = 'clicks';
if (s.linkName.match(/Promo Link/i)) kiwi._navTrackGoals = 'none';
if (s.linkName === 'Nav Link') kiwi._promoTrackGoals = 'none';
_satellite.notify('KIWI: Promo/Nav Track Goals //click track - link type: '+ s.linkType + ', '+ s.linkName);
}
}
} else {
//page load track - collect promo views on page (e.g. SSR but also BF First Level Tabs, also Modals as pages)
kiwi.util.fireCustomEvent('Page View');
kiwi._promoTrackGoals = 'views';
kiwi._navTrackGoals = 'both';
_satellite.notify('KIWI: Promo/Nav Track Goals //page load track - collect promo views on page');
}
if (s.linkName && (s.linkName === 'Widgets Ready' ||
s.linkName.match(/Feature Clicks - /i) ||
s.linkName.match(/Feature Used - /i))) {
//widget state change or feature click
kiwi._promoTrackGoals = '';
kiwi._navTrackGoals = '';
//_satellite.notify('KIWI: Promo/Nav Track Goals = NONE//atlas widget or feature clicks - track in a new way');
}
/* end Promo/Nav Track Goals Setup */
/* Promo Views/Clicks */
if (kiwi._promoTrackGoals === 'clicks') {
//_satellite.notify('KIWI: Promo Track Goals = clicks');
/* Promo Clicks */
var sPromoClicked2017 = _satellite.getVar('Promo - Clicked'),
sPromoClicked2019 = _satellite.getVar('Promo - Clicked 2019');
if (sPromoClicked2017 || sPromoClicked2019) {
//merge promos clicked
//sPromoClicked = kiwi.util.mergeLists(sPromoClicked2017, sPromoClicked2019);
//track 2017 promos
if (sPromoClicked2017 && kiwi._thisPage.siteSettings.use2017promos) {
s.list1 = sPromoClicked2017; //Promos (CTR)
s.linkTrackVars = s.apl(s.linkTrackVars, 'list1', ',', 2);
s.list2 = sPromoClicked2017; //Promos (Conv)
s.linkTrackVars = s.apl(s.linkTrackVars, 'list2', ',', 2);
s.events = s.apl(s.events, 'event99', ',', 2); //Promo Clicks
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event99', ',', 2);
s.linkTrackVars = s.apl(s.linkTrackVars, 'events', ',', 2);
}
//track 2019 promos
if (sPromoClicked2019) {
s.list3 = sPromoClicked2019; //Promos (CTR) 2019
s.linkTrackVars = s.apl(s.linkTrackVars, 'list3', ',', 2);
s.eVar18 = sPromoClicked2019; //Promos (Conv) 2019
s.linkTrackVars = s.apl(s.linkTrackVars, 'eVar18', ',', 2);
s.events = s.apl(s.events, 'event57', ',', 2); //Promo Clicks 2019
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event57', ',', 2);
s.linkTrackVars = s.apl(s.linkTrackVars, 'events', ',', 2);
}
}
_satellite.notify('KIWI: Promo 2017 Tracked: ' + sPromoClicked2017);
_satellite.notify('KIWI: Promo 2019 Tracked: ' + sPromoClicked2019);
var sPromoClickedTnT = _satellite.getVar('Promo - Clicked TnT');
if (sPromoClickedTnT) {
//track tnt promos
s.list3 = sPromoClickedTnT; //Promos (CTR) 2019
s.linkTrackVars = s.apl(s.linkTrackVars, 'list3', ',', 2);
s.eVar18 = sPromoClickedTnT; //Promos (Conv) 2019
s.linkTrackVars = s.apl(s.linkTrackVars, 'eVar18', ',', 2);
s.events = s.apl(s.events, 'event57', ',', 2); //Promo Clicks 2019
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event57', ',', 2);
s.linkTrackVars = s.apl(s.linkTrackVars, 'events', ',', 2);
}
_satellite.notify('KIWI: Promo TnT Tracked: ' + sPromoClickedTnT);
/* SSS Opt-Ins/re-Opt-Ins */
var promoWasOptin = sPromoClicked2017.match(/widget-sssoptin:optin\|yes/i) || false,
sEvent = '',
sEventDedupeString = '',
sEventFriendlyName = '';
if (promoWasOptin) {
sEvent = 'event59';
sEventFriendlyName = 'SSS Opt Ins';
} else {
promoWasOptin = sPromoClicked2017.match(/widget-sssoptin:reoptin\|yes/i) || false;
if (promoWasOptin) {
sEvent = 'event196';
sEventFriendlyName = 'SSS re-Opt Ins';
}
}
if (promoWasOptin) {
sEventDedupeString = sEvent + ':' + kiwi.cookie.sess.user.cbId;
s.linkTrackEvents=s.apl(s.linkTrackEvents, sEvent, ',', 2);
s.events = s.apl(s.events, sEventDedupeString, ',', 2); //SSS Opt-Ins, SSS re-Opt-Ins
_satellite.notify('KIWI: Custom Event Tracked: ' + sEventFriendlyName + ': ' + sEventDedupeString);
}
/* endSSS Opt-Ins/re-Opt-Ins */
/* end Promo Clicks */
} else if (kiwi._promoTrackGoals === 'views') {
_satellite.notify('KIWI: Promo Track Goals = views');
/* Promo Views */
var sPromoViews2017 = _satellite.getVar('Promo - Views'),
sPromoViews2019 = _satellite.getVar('Promo - Views 2019'),
sTntPromoViews = _satellite.getVar('Promo - Views TnT');
if (sPromoViews2017 || sPromoViews2019) {
s.linkTrackVars = s.apl(s.linkTrackVars, 'events,list1,list3', ',', 2);
s.linkTrackEvents = s.apl(s.linkTrackEvents, 'event98,event12,event56', ',', 2);
//merge promo views lists
//sPromoViews = kiwi.util.mergeLists(sPromoViews2017, sPromoViews2019);
//track 2017 promos
if (sPromoViews2017 && kiwi._thisPage.siteSettings.use2017promos) {
var arrPromoViews2017 = sPromoViews2017.split(',');
for (var iPv17 = 0; iPv17 < arrPromoViews2017.length; iPv17++) {
s.list1 = s.apl(s.list1, arrPromoViews2017[iPv17], ',', 2); //Promos (CTR)
}
s.events = s.apl(s.events, 'event98', ',', 2); //Promo Views
s.events = s.apl(s.events, 'event12', ',', 2); //Internal Campaign Views (legacy)
}
//track 2019 promos
if (sPromoViews2019) {
var arrPromoViews2019 = sPromoViews2019.split(',');
for (var iPv19 = 0; iPv19 < arrPromoViews2019.length; iPv19++) {
s.list3 = s.apl(s.list3, arrPromoViews2019[iPv19], ',', 2); //Promos (CTR) 2019
}
s.events = s.apl(s.events, 'event56', ',', 2); //Promo Views 2019
}
}
if (sTntPromoViews) {
s.linkTrackVars = s.apl(s.linkTrackVars, 'events,list3', ',', 2);
s.linkTrackEvents = s.apl(s.linkTrackEvents, 'event56', ',', 2);
//track tnt promos
if (sTntPromoViews) {
var arrTnTPromoViews = sTntPromoViews.split(',');
for (var iPvTnt = 0; iPvTnt < arrTnTPromoViews.length; iPvTnt++) {
s.list3 = s.apl(s.list3, arrTnTPromoViews[iPvTnt], ',', 2); //Promos (CTR) 2019
}
s.events = s.apl(s.events, 'event56', ',', 2); //Promo Views 2019
}
}
/* end Promo Views */
}
/* end Promo Views/Clicks */
/* Nav Views/Clicks */
/* Global Nav Clicks - legacy method */
s.prop49 = _satellite.getVar('Global Nav ID');
s.prop49 = s.getValOnce(s.prop49, 'gvo_c49', 0); //Global Nav ID
if (s.prop49) {
s.events = s.apl(s.events, 'event70', ',', 2); //Global Nav Clicks
}
/* end Global Nav Clicks */
if (kiwi._navTrackGoals === 'both' || kiwi._navTrackGoals === 'views') {
_satellite.notify('KIWI: Nav Track Goals = both/views');
/* Nav Views */
var sNavViewEvents = _satellite.getVar('Nav - Views');
if (sNavViewEvents) {
//for CTR Tracking:
s.linkTrackVars = s.apl(s.linkTrackVars, 'events', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, sNavViewEvents, ',', 2);
s.events = s.apl(s.events, sNavViewEvents, ',', 2); //[xyz] Nav Views
}
/* end Nav Views */
}
if (kiwi._navTrackGoals === 'both' || kiwi._navTrackGoals === 'clicks') {
_satellite.notify('KIWI: Nav Track Goals = both/clicks');
/* Nav Clicks */
if (kiwi._skipTrackNav) kiwi._skipTrackNav = false;
else {
var sNavClicked = _satellite.getVar('Nav - Clicked');
if (sNavClicked) {
var sArrNavClicked = sNavClicked.split('|'),
oNav = { //e.g. event221|global|gh|Skip to content|#main-content, event229|local|program-band|Major & Career Search
clickEvent: sArrNavClicked[0] || '',
type: sArrNavClicked[1],
key: sArrNavClicked[2],
subNav: sArrNavClicked[3] || '',
text: sArrNavClicked[4] || '',
hash: sArrNavClicked[5] || ''
},
sNavTracked = oNav.key + ':' + oNav.subNav+ ':' + oNav.text;
sNavTracked = oNav.hash?'nav-toggle:' + sNavTracked:'nav-click:' + sNavTracked;
if (oNav.hash) {
'nav-toggle:' + sNavTracked;
}
s.prop43 = sNavTracked;
s.linkTrackVars=s.apl(s.linkTrackVars, 'prop43,', ',', 2);
if (oNav.clickEvent) {
s.events = s.apl(s.events, oNav.clickEvent, ',', 2); //[xyz] Nav Clicks
s.linkTrackVars = s.apl(s.linkTrackVars, 'events', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, oNav.clickEvent, ',', 2);
switch (oNav.type) {
case 'global':
s.events = s.apl(s.events, 'event70', ',', 2); //Global Nav Clicks
s.linkTrackVars = s.apl(s.linkTrackVars, 'events', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event70', ',', 2);
break;
case 'local':
s.events = s.apl(s.events, 'event95', ',', 2); //Local Nav Clicks
s.linkTrackVars = s.apl(s.linkTrackVars, 'events', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event95', ',', 2);
break;
default:
break;
}
}
//Reset Vars after track
document.cookie = 'cbtrack_nav=; expires=-1; path=/; domain=.collegeboard.org';
if (cbTrackData.localNavItemClicked) {//from SSR
_satellite.notify('KIWI: cbTrackData.localNavItemClicked = ' + cbTrackData.localNavItemClicked);
cbTrackData.localNavItemClicked = '';
}
_satellite.notify('KIWI: Nav Tracked: ' + sNavClicked);
}
}
/* end Nav Clicks */
}
/* end Nav Views/Clicks */
/* College Lists */
// College List Starts/Saves
(function(oData, deduper){
if (oData && oData.hasData) {
// - Set on Page Track in BF React
_satellite.notify('KIWI: College List Data found!: ' + JSON.stringify(oData));
s.events = s.apl(s.events, 'event190:' + deduper, ',', 2); //College List Saves, Deduped
if (oData.rmsListStarted) {
s.events = s.apl(s.events, 'event202:' + deduper, ',', 2); //RMS College List Started, Deduped
}
if (oData.rmsListFulfilled) {
s.events = s.apl(s.events, 'event203:' + deduper, ',', 2); //RMS College List Fullfilled, Deduped
}
}
})(_satellite.getVar('Data - College List'), kiwi.user.cbId); //oData, deduper
//College List Adds
(function(oData, deduper){
// - Set on Link Track (DCR) in BF React
if (oData && oData.hasData) {
_satellite.notify('KIWI: College Added!: ' + JSON.stringify(oData));
//first derive legacy isFirstCollege
if (oData.addSource.match(/^(BF GWT|BF Mobile)$/i)) {
var sCollegeListCreated='true';
sCollegeListCreated=s.getValOnce(sCollegeListCreated,'s_collegeListCreated', 99999);
if(sCollegeListCreated) {
oData.isFirstCollege = true;
}
}
s.events = s.apl(s.events, 'event66', ',', 2); //College List Adds
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event66', ',', 2);
s.eVar60 = oData.addMethod;
s.eVar11 = oData.collegeAdded;
s.linkTrackVars=s.apl(s.linkTrackVars, 'eVar60', ',', 2);
s.linkTrackVars=s.apl(s.linkTrackVars, 'eVar11', ',', 2);
s.linkTrackVars=s.apl(s.linkTrackVars, 'events', ',', 2);
if (oData.isFirstCollege) {
_satellite.notify('KIWI: New College List!: ' + JSON.stringify(oData));
s.events = s.apl(s.events, 'event67', ',', 2); //College Lists Created (legacy metric, not deduped)
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event67', ',', 2);
if (deduper) {
s.events = s.apl(s.events, 'event190:' + deduper, ',', 2); //College List Saves, Deduped
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event190', ',', 2);
kiwi.util.fireCustomEvent('College List Saved');
if (oData.isRmsCollege) {
s.events = s.apl(s.events, 'event202:' + deduper, ',', 2); //RMS College List Started, Deduped
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event202', ',', 2);
}
}
}
} else {
//Abort Link Track if no Data to Capture
if (s.linkType === 'o' && s.linkName === 'College Add') {
_satellite.notify('College Add Link Track: No data to capture, aborting tracking call.')
s.abort = true;
}
}
})(_satellite.getVar('Data - College List Add'), kiwi.user.cbId); //oData, deduper
//RMS Score Changes
(function(oData){
// - Set on Link Track (DCR) in BF React
if (oData && oData.hasData) {
_satellite.notify('KIWI: RMS Score Changed!: ' + JSON.stringify(oData));
s.events = s.apl(s.events, 'event204', ',', 2); //RMS Score Changes
s.linkTrackVars=s.apl(s.linkTrackVars, 'events', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event204', ',', 2);
s.eVar6 = oData.scoreType;
s.linkTrackVars=s.apl(s.linkTrackVars, 'eVar6', ',', 2);
} else {
if (s.linkType === 'o' && s.linkName === 'RMS Score Change') {
s.abort = true;
}
}
})(_satellite.getVar('Data - RMS Score Change')); //oData
/* end College Lists */
/* CB Opportunity Scholarships Events */
//many of these are also set on Link Track (DCR) but deduped through serialization
(function(oData){
if (oData && oData.hasData) {
_satellite.notify('KIWI: CBOS Events Data Found: ' + JSON.stringify(oData));
var serializeVal = kiwi.user.cbId+'-'+kiwi.user.gradYear;
//"Build"
if (oData.build) s.events = s.apl(s.events, 'event136:'+serializeVal, ',', 2); //CBOS Students - Build College List
//"Practice"
if (oData.practice) s.events = s.apl(s.events, 'event137:'+serializeVal, ',', 2); //CBOS Students - Practice SAT
//"Improve"
if (oData.improve) s.events = s.apl(s.events, 'event138:'+serializeVal, ',', 2); //CBOS Students - Improve Score
//"Strengthen"
if (oData.strengthen) s.events = s.apl(s.events, 'event139:'+serializeVal, ',', 2); //CBOS Students - Strengthen List
//"Complete"
if (oData.complete) s.events = s.apl(s.events, 'event132:'+serializeVal, ',', 2); //CBOS Students - Complete FAFSA
//"Apply"
if (oData.apply) s.events = s.apl(s.events, 'event133:'+serializeVal, ',', 2); //CBOS Students - Apply to Colleges
//"Complete Your Journey"
if (oData.cyj) s.events = s.apl(s.events, 'event135:'+serializeVal, ',', 2); //CBOS Students - Complete Journey
}
})(_satellite.getVar('Data - CBOS')); //oData
/* end CB Opportunity Scholarships Events */
/* Score View Tracking */
(function(oData){
if (oData && oData.hasData) {
_satellite.notify('KIWI: Data - Score View found: ' + JSON.stringify(oData));
if (oData.sat.adminCode) {
s.eVar51 = oData.sat.adminType + '-' + oData.sat.adminCode; //SAT Score View Admin
s.eVar51 = s.eVar51.toLowerCase();
var satSVEventDedupeKey = oData.sat.adminRegId;
satSVEventDedupeKey = satSVEventDedupeKey.toUpperCase(); //set it this way to match NSAT
var satSVEvent = 'event24:' + satSVEventDedupeKey;
s.events = s.apl(s.events, satSVEvent, ',', 2); //SAT Score Views
var satSVEventDedupeKey2 = kiwi.user.cbId + '-' + s.eVar51;
satSVEventDedupeKey2 = satSVEventDedupeKey2.toLowerCase();
s.events = s.apl(s.events, 'event116:'+satSVEventDedupeKey2, ',', 2); //SAT Multiple Choice Score Views
if (s.pageName.match(/^ssr:score-(report|overview):/i)) { //score report page only
s.events = s.apl(s.events, 'event118:' + satSVEventDedupeKey2, ',', 2); //SAT Score Report Views
}
s.linkTrackVars=s.apl(s.linkTrackVars, 'eVar51', ',', 2);
s.linkTrackVars=s.apl(s.linkTrackVars, 'events', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event24', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event116', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event118', ',', 2);
if (kiwi._thisPage.siteCode === 'ssr' && kiwi._thisPage.pageCode.match(/^dashboard/i)) { //dashboard page only
kiwi.util.fireCustomEvent(
'SAT Score Viewed', {
adminType: oData.sat.adminType,
adminDate: oData.sat.adminCode,
registrantType: oData.sat.registrantType,
fwStatus: oData.sat.fwStatus,
scoreBand: oData.sat.scoreBand
});
}
}
if (oData.psat.adminCode) {
s.eVar72 = oData.psat.adminType + '-' + oData.psat.adminCode; //PSAT Score View Admin
s.eVar72 = s.eVar72.toLowerCase();
var psatSVEventDedupeKey = kiwi.user.cbId + '-' + s.eVar72;
var psatSVEvent = 'event88:' + psatSVEventDedupeKey;
s.events = s.apl(s.events, psatSVEvent, ',', 2); //PSAT Score Views
if (s.pageName.match(/^ssr:score-(report|overview):/i)) { //score report page only
s.events = s.apl(s.events, 'event119:'+psatSVEventDedupeKey, ',', 2); //PSAT Score Report Views
}
s.linkTrackVars=s.apl(s.linkTrackVars, 'eVar72', ',', 2);
s.linkTrackVars=s.apl(s.linkTrackVars, 'events', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event88', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event119', ',', 2);
if (kiwi._thisPage.siteCode === 'ssr' && kiwi._thisPage.pageCode.match(/^dashboard/i)) { //dashboard page only
kiwi.util.fireCustomEvent(
'PSAT Score Viewed', {
adminType: oData.psat.adminType,
adminDate: oData.psat.adminCode,
registrantType: oData.psat.registrantType,
fwStatus: oData.psat.fwStatus,
scoreBand: oData.psat.scoreBand
});
}
}
if (kiwi._thisPage.siteCode === 'ssr' && kiwi._thisPage.pageCode.match(/dashboard/i)) { //dashboard pages only
s.eVar64 = _satellite.getVar('AppData Score Status');
}
} else {
if (s.prop32 === 'ssr' && cbTrackData.pageCode && cbTrackData.pageCode.match(/sat-essays:/i)) {//TODO: get SAT Essay score view reporing working via DDL instead of in this brittle way
if (!s.prop12 || (s.prop12 && !(s.prop12.match(/on-page-alert (warning): Your SAT Essay scores/i)))) {
var arrPageCode = cbTrackData.pageCode.split(':');
s.eVar51 = arrPageCode[1] + '-' + arrPageCode[2]; //SAT Score View Admin
s.eVar51 = s.eVar51.toLowerCase();
var satSVEventDedupeKey3 = kiwi.user.cbId + '-' + s.eVar51;
satSVEventDedupeKey3 = satSVEventDedupeKey3.toLowerCase();
s.events = s.apl(s.events, 'event58:'+satSVEventDedupeKey3, ',', 2); //SAT Essay Score Views
s.linkTrackVars=s.apl(s.linkTrackVars, 'eVar51,events', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event58', ',', 2);
}
}
}
//Mark DDL as tracked!
kiwi.ddl.aaTracked.scoreView = true;
})(_satellite.getVar('Data - Score View'));
/* end Score View Tracking */
/* Features Used - Legacy Method */
(function(sFeatureUsed){
_satellite.notify('KIWI: Feature Used found: ' + sFeatureUsed);
if (sFeatureUsed) {
s.linkTrackVars=s.apl(s.linkTrackVars, 'prop43', ',', 2);
s.prop43 = s.apl(s.prop43, sFeatureUsed, '^', 2); //Features Used
if (kiwi._timesThruDoPlugins) {
//clear out page-tracked feature used...
if (cbTrackData.featureUsed) cbTrackData.featureUsed = '';
if (cbTrackData.user && cbTrackData.user.featureUsed) cbTrackData.user.featureUsed = ''; //legacy DDL settings by BF Mobile
var ddlEvents = _satellite.getVar('DDL Events');
if (ddlEvents && ddlEvents.length) {
var deleteIdx = 0;
for (var i = 1; i < ddlEvents.length + 1; i++) {
var e = ddlEvents[i-1];
if (
typeof e.eventInfo !== 'undefined'
&& typeof e.eventInfo.eventName !== 'undefined'
&& e.eventInfo.eventName == 'Feature Used'
) {
deleteIdx = i-1;
break;
}
}
ddlEvents[deleteIdx] = {};
}
}
}
})(_satellite.getVar('Feature Used'));
/* end Features Used - Legacy Method */
/* Feature Views */
kiwi.trackFeatureViews = function(featData, featId) {
ruleName = 'KIWI: kiwi.trackFeatureViews';
//var featData = _satellite.getVar(featDataName);
if (featData && featData.hasData) {
_satellite.notify(ruleName + ': ' + featId + ' found: ' + JSON.stringify(featData));
kiwi.cookie.sess.features[featId] = kiwi.cookie.sess.features[featId] || {};
for (var i = 0; i < featData.featureNames.length; i++) {
var featureName = featData.featureNames[i],
bAlreadyInSess = (kiwi.cookie.sess.features[featId][kiwi._thisPage.siteCode] &&
kiwi.cookie.sess.features[featId][kiwi._thisPage.siteCode].hasOwnProperty(featureName));
//report these things only once per session cookie + featureName instance
if(!bAlreadyInSess && !featData.wireUpOnly) {
s.linkTrackVars=s.apl(s.linkTrackVars, 'eVar34', ',', 2);
s.linkTrackVars=s.apl(s.linkTrackVars, 'prop43', ',', 2);
s.linkTrackVars=s.apl(s.linkTrackVars, 'events', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event242', ',', 2);
s.eVar34 = 'D=pageName'; //Feature Page
s.prop43 = s.apl(s.prop43, featData.featureType + ':' + featureName, '^', 2); //Features Used
s.events = s.apl(s.events, 'event242', ',', 2); //Feature Views
switch (featId) {
case 'filters':
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event240', ',', 2);
s.events = s.apl(s.events, 'event240', ',', 2); //Filter Views
break;
default:
break;
}
kiwi._sessCookieMod = true;
kiwi.cookie.sess.features[featId][kiwi._thisPage.siteCode] = kiwi.cookie.sess.features[featId][kiwi._thisPage.siteCode] || {};
kiwi.cookie.sess.features[featId][kiwi._thisPage.siteCode][featureName] = 0;
}
//report these things regardless of featureName instance
switch (featId) {
/*case 'lnavtop':
//s.linkTrackVars=s.apl(s.linkTrackEvents, 'event220', ',', 2);
//s.events = s.apl(s.events, 'event220', ',', 2); //Global Header Nav Views
break;*/
case 'widget':
switch (featureName) {
case 'header':
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event220', ',', 2);
s.events = s.apl(s.events, 'event220', ',', 2); //Global Header Nav Views
break;
case 'footer':
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event222', ',', 2);
s.events = s.apl(s.events, 'event222', ',', 2); //Global Footer Nav Views
break;
case 'identity':
if (kiwi.userIsLoggedIn) {
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event232', ',', 2);
s.events = s.apl(s.events, 'event232', ',', 2); //Global Login Nav Views
} else {
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event230', ',', 2);
s.events = s.apl(s.events, 'event230', ',', 2); //Global Student/Prof Nav Views
}
break;
case 'bfcl':
s.linkTrackVars = s.apl(s.linkTrackVars, 'prop34', ',', 2);
s.prop34 = 'bfcl:bar'; //Widget Screen
break;
default:
break;
}
break;
default:
break;
}
//indicate auto-sugg term results in DOM
if (kiwi.cookie.sess.prev['isQuick']) {
var elSS = document.querySelector('[data-cbtrack-widget="sitesearch"], .lv-search-widget');
if (elSS) {elSS.setAttribute('data-cbtrack-autosuggtermused','');}
}
//check for site search promo views
var ssBannerViews = [],
bannerAreas = document.querySelectorAll('[data-cbtrack-searchbanner], #sitesearch .lv-banner, #sitesearch .lv-no-results');
for (var m = 0; m < bannerAreas.length; m++) {
var oPromoPrefixMap = {'trustee_search':'feat','related_search':'rel','noresults':'noresults'},
myBanner = bannerAreas[m],
myBannerType = myBanner.getAttribute('data-cbtrack-searchbanner') || '',
myBannerArea = myBannerType?oPromoPrefixMap[myBannerType]:'';
if (!myBannerArea) {//legacy site search widget banner elements
myBannerArea = myBanner.classList.contains('lv-banner-type-related_search')?'rel':myBannerArea;
myBannerArea = myBanner.classList.contains('lv-banner-type-trustee_search')?'feat':myBannerArea;
myBannerArea = myBanner.classList.contains('lv-no-results')?'noresults':myBannerArea;
}
var myBannerEls = myBanner.querySelectorAll('a');
for (var n = 0; n < myBannerEls.length; n++) {
var bannerPromoView = 'ss:'+myBannerArea+':',
myBannerEl = myBannerEls[n],
myBannerViewAlreadyTracked = (!!myBannerEl.hasAttribute('data-kiwi-promo-view')),
myBannerLinkAlreadyTracked = (!!myBannerEl.hasAttribute('data-kiwi-promo-link'));
//track view
if (!myBannerViewAlreadyTracked) {
bannerPromoView += myBannerEl.getAttribute('data-cbtrack-label') || kiwi.util.getFeatureText(myBannerEl);
ssBannerViews.push(bannerPromoView);
myBannerEl.setAttribute('data-kiwi-promo-view', '');
}
//track link
if (!myBannerLinkAlreadyTracked) {
_satellite.notify(ruleName+': wiring up site search promo/banner links');
var alreadyWired = false;
if ((myBannerEl.hasAttribute('data-kiwi-sspromo-link'))) {alreadyWired = true;}
if (!alreadyWired) {myBannerEl.setAttribute('data-kiwi-sspromo-link', bannerPromoView);}
//prevent tracking by legacy promo 2019 code
myBannerEl.setAttribute('data-kiwi-promo-link', '');
myBannerEl.removeAttribute('data-cb-adcode', '');
myBannerEl.removeAttribute('trackclickvalue', '');
}
}
}
if (ssBannerViews.length) {
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event56', ',', 2);
s.events = s.apl(s.events, 'event56', ',', 2);
s.linkTrackVars = s.apl(s.linkTrackVars, 'events', ',', 2);
s.linkTrackVars = s.apl(s.linkTrackVars, 'list3', ',', 2);
for (var ssb = 0; ssb < ssBannerViews.length; ssb++) {
s.list3 = s.apl(s.list3, ssBannerViews[ssb], ',', 2); //Promos (CTR) 2019
}
}
//check for other promo views
var promoViews = [],
els = {},
promoViewPrefix = '';
//Widget Screen Els vs. Other Feature Els
if (featData.widgetName) {
promoViewPrefix = 'widget:'+ featData.widgetName + ':' + featureName + ':';
els = document.querySelectorAll('[data-cbtrack-widget="'+featData.widgetName+'"] [data-cbtrack-linkgroup="'+featureName+'"]');
} else {
promoViewPrefix = kiwi._thisPage.siteCode + ':' + featData.featureType + ':' + featureName + ':';
els = document.querySelectorAll('[data-cbtrack-'+ featId +'="'+featureName+'"]');
}
for (var j = 0; j < els.length; j++) {
var promoEls = els[j].querySelectorAll('[data-cbtrack-promo], [data-cbtrack-linktype*="promo"]');
for (var k = 0; k < promoEls.length; k++) {
function isHidden(el) {
var isHidden = false,
style = window.getComputedStyle(el);
isHidden = ((style.display === 'none') || (style.visibility === 'hidden'));
if (!isHidden && kiwi.util.getClosest) {
isHidden = !!(kiwi.util.getClosest(el, '[aria-hidden="true"]'));
}
return isHidden;
}
if (!isHidden(promoEls[k])) {
var promoView = promoViewPrefix;
promoView += kiwi.util.getFeatureText(promoEls[k]);
promoViews.push(promoView);
//prevent tracking by promo 2019 code
promoEls[k].setAttribute('data-kiwi-promo-link', '');
if (featData.widgetScreenName) {promoEls[k].setAttribute('data-kiwi-widgetscreenname', featData.widgetScreenName);}
}
}
}
if (promoViews.length) {
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event56', ',', 2);
if (kiwi._thisPage.siteSettings.use2017promos) {
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event98', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event12', ',', 2);
s.events = s.apl(s.events, 'event98', ',', 2);
s.events = s.apl(s.events, 'event12', ',', 2);
s.linkTrackVars = s.apl(s.linkTrackVars, 'list1', ',', 2);
}
s.events = s.apl(s.events, 'event56', ',', 2);
s.linkTrackVars = s.apl(s.linkTrackVars, 'events', ',', 2);
s.linkTrackVars = s.apl(s.linkTrackVars, 'list3', ',', 2);
for (var iPv = 0; iPv < promoViews.length; iPv++) {
if (kiwi._thisPage.siteSettings.use2017promos) {
s.list1 = s.apl(s.list1, promoViews[iPv], ',', 2); //Promos (CTR)
}
s.list3 = s.apl(s.list3, promoViews[iPv], ',', 2); //Promos (CTR) 2019
}
}
}
}
};
if (!cbTrackData || !cbTrackData.siteCode || cbTrackData.siteCode !== 'bfm') {
kiwi.trackFeatureViews(_satellite.getVar('Feature Views - Accordions'), 'accordion');
kiwi.trackFeatureViews(_satellite.getVar('Feature Views - Crosslinks'), 'crosslink');
kiwi.trackFeatureViews(_satellite.getVar('Feature Views - CTA Cards'), 'ctacard');
kiwi.trackFeatureViews(_satellite.getVar('Feature Views - Event Cards'), 'ec');
kiwi.trackFeatureViews(_satellite.getVar('Feature Views - Filters'), 'filter');
kiwi.trackFeatureViews(_satellite.getVar('Feature Views - Jump Links'), 'jumplinks');
kiwi.trackFeatureViews(_satellite.getVar('Feature Views - Key Benefits'), 'keybenefits');
kiwi.trackFeatureViews(_satellite.getVar('Feature Views - Layout Panels'), 'layp');
//kiwi.trackFeatureViews(_satellite.getVar('Feature Views - Local Nav Top'), 'lnavtop');
kiwi.trackFeatureViews(_satellite.getVar('Feature Views - Custom'), 'custom');
kiwi.trackFeatureViews(_satellite.getVar('Feature Views - Features'), 'feature');
}
if (kiwi.widgetTrack) kiwi.trackFeatureViews(_satellite.getVar('Feature Views - Widgets'), 'widget');
/* end Feature Views */
/* Feature Clicks */
kiwi.trackFeatureClicks = function(featData, featId) {
ruleName = 'KIWI: kiwi.trackFeatureClicks';
//var featData = _satellite.getVar(featDataName);
if (featData && featData.hasData) {
_satellite.notify(ruleName + ': ' + featId + ' found: ' + JSON.stringify(featData));
s.eVar34 = 'D=c25'; //Feature Page
s.prop43 = featData.featureType + ':' + featData.featureName; //Features Used
s.prop29 = featData.featureOptions; //Feature Options Used
var usageCount = 0;
try {usageCount = kiwi.cookie.sess.features[featId][kiwi._thisPage.siteCode][featData.featureName];}
catch(e) {_satellite.notify('Kiwi: ' + featId + ' cookie issue for Usage Count');}
if (parseInt(usageCount, 10)) {
//track additional usage as additional views, to keep CTR in good shape
s.events = s.apl(s.events, 'event242', ',', 2); //Feature Views
switch (featId) {
case 'filter':
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event240', ',', 2);
s.events = s.apl(s.events, 'event240', ',', 2); //Filter Views
break;
default:
break;
}
}
usageCount += 1;
s.events = s.apl(s.events, 'event243', ',', 2); //Feature Clicks
s.prop30 = usageCount; //Feature Used Count
s.linkTrackVars=s.apl(s.linkTrackVars, 'eVar34', ',', 2);
s.linkTrackVars=s.apl(s.linkTrackVars, 'prop43', ',', 2);
s.linkTrackVars=s.apl(s.linkTrackVars, 'events', ',', 2);
s.linkTrackVars=s.apl(s.linkTrackVars, 'prop29', ',', 2);
s.linkTrackVars=s.apl(s.linkTrackVars, 'prop30', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event242', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event243', ',', 2);
kiwi._sessCookieMod = true;
kiwi.cookie.sess.features[featId][kiwi._thisPage.siteCode] = kiwi.cookie.sess.features[featId][kiwi._thisPage.siteCode] || {};
kiwi.cookie.sess.features[featId][kiwi._thisPage.siteCode][featData.featureName] = usageCount;
//track additional things by feature type
switch (featId) {
case 'filter':
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event241', ',', 2);
s.events = s.apl(s.events, 'event241', ',', 2); //Filter Applies
break;
case 'widget':
//check for widgetScreen
if (featData.widgetScreenName) {
s.linkTrackVars = s.apl(s.linkTrackVars, 'prop34', ',', 2);
s.prop34 = featData.widgetScreenName; //Widget Screen
}
break;
default:
break;
}
//check for nav clicks
if (featData.linkTypes.match(/(^|,)nav(,|$)/i)) {
switch (featData.featureName) {
case 'header':
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event221', ',', 2);
s.events = s.apl(s.events, 'event221', ',', 2); //Global Header Nav Clicks
s.eVar61 = kiwi._thisPage.siteCode + ':' + featData.featureOptions;
s.eVar61 = s.getValOnce(s.eVar61, 'gvo_v61', 0); //Global Nav ID 2019
if (s.eVar61) {
s.linkTrackVars=s.apl(s.linkTrackVars, 'eVar61', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event70', ',', 2);
s.events = s.apl(s.events, 'event70', ',', 2); //Global Nav Clicks
}
break;
case 'footer':
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event223', ',', 2);
s.events = s.apl(s.events, 'event223', ',', 2); //Global Footer Nav Clicks
s.eVar61 = kiwi._thisPage.siteCode + ':' + featData.featureOptions;
s.eVar61 = s.getValOnce(s.eVar61, 'gvo_v61', 0); //Global Nav ID 2019
if (s.eVar61) {
s.linkTrackVars=s.apl(s.linkTrackVars, 'eVar61', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event70', ',', 2);
s.events = s.apl(s.events, 'event70', ',', 2); //Global Nav Clicks
}
break;
case 'identity':
if (kiwi.userIsLoggedIn) {
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event233', ',', 2);
s.events = s.apl(s.events, 'event233', ',', 2); //Student/Prof Nav Clicks
s.eVar61 = kiwi._thisPage.siteCode + ':' + featData.featureOptions;
s.eVar61 = s.getValOnce(s.eVar61, 'gvo_v61', 0); //Global Nav ID 2019
if (s.eVar61) {
s.linkTrackVars=s.apl(s.linkTrackVars, 'eVar61', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event70', ',', 2);
s.events = s.apl(s.events, 'event70', ',', 2); //Global Nav Clicks
}
} else {
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event231', ',', 2);
s.events = s.apl(s.events, 'event231', ',', 2); //Identity Pre-Auth Clicks
s.eVar61 = kiwi._thisPage.siteCode + ':' + featData.featureOptions;
s.eVar61 = s.getValOnce(s.eVar61, 'gvo_v61', 0); //Global Nav ID 2019
if (s.eVar61) {
s.linkTrackVars=s.apl(s.linkTrackVars, 'eVar61', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event70', ',', 2);
s.events = s.apl(s.events, 'event70', ',', 2); //Global Nav Clicks
}
}
break;
default:
break;
}
}
var promoName = '',
blnTrack2017 = blnTrack2019 = true;
//check for sspromo clicks
if (featData.ssPromoName) {
promoName = featData.ssPromoName;
blnTrack2017 = false;
} else if (featData.linkTypes.match(/(^|,)promo(,|$)/i)) {
//check for other promo clicks
if (featId==='widget') {
promoName = featData.featureType + ':' + featData.featureName + ':' + featData.featureOptions;
} else {
promoName = kiwi._thisPage.siteCode + ':' + featData.featureType + ':' + featData.featureName + ':' + featData.featureOptions;
}
}
//track promo clicks
if (promoName) {
s.linkTrackVars = s.apl(s.linkTrackVars, 'events', ',', 2);
if (blnTrack2017 && kiwi._thisPage.siteSettings.use2017promos) {
s.events=s.apl(s.events, 'event99', ',', 2); //Promo Clicks
s.list1 = promoName; //Promos (CTR)
s.list2 = promoName; //Promos (Conv)
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event99', ',', 2);
s.linkTrackVars = s.apl(s.linkTrackVars, 'list1', ',', 2);
s.linkTrackVars = s.apl(s.linkTrackVars, 'list2', ',', 2);
_satellite.notify('KIWI: Promo 2017 Tracked: ' + promoName);
}
if (blnTrack2019) {
s.events=s.apl(s.events, 'event57', ',', 2); //Promo Clicks 2019
s.list3 = promoName; //Promos (CTR) 2019
s.eVar18 = promoName; //Promos (Conv) 2019
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event57', ',', 2);
s.linkTrackVars = s.apl(s.linkTrackVars, 'list3', ',', 2);
s.linkTrackVars = s.apl(s.linkTrackVars, 'eVar18', ',', 2);
_satellite.notify('KIWI: Promo 2019 Tracked: ' + promoName);
}
}
}
};
if (s.linkType === 'o') {
if (s.linkName === 'Feature Used - Accordion') kiwi.trackFeatureClicks(_satellite.getVar('Feature Clicks - Accordion'), 'accordion');
if (s.linkName === 'Feature Used - Crosslink') kiwi.trackFeatureClicks(_satellite.getVar('Feature Clicks - Crosslink'), 'crosslink');
if (s.linkName === 'Feature Used - CTA Card') kiwi.trackFeatureClicks(_satellite.getVar('Feature Clicks - CTA Card'), 'ctacard');
if (s.linkName === 'Feature Used - Event Card') kiwi.trackFeatureClicks(_satellite.getVar('Feature Clicks - Event Card'), 'ec');
if (s.linkName === 'Feature Used - Filter') kiwi.trackFeatureClicks(_satellite.getVar('Feature Clicks - Filter'), 'filter');
if (s.linkName === 'Feature Used - Jump Link') kiwi.trackFeatureClicks(_satellite.getVar('Feature Clicks - Jump Link'), 'jumplinks');
if (s.linkName === 'Feature Used - Key Benefit') kiwi.trackFeatureClicks(_satellite.getVar('Feature Clicks - Key Benefits'), 'keybenefits');
if (s.linkName === 'Feature Used - Layout Panel') kiwi.trackFeatureClicks(_satellite.getVar('Feature Clicks - Layout Panel'), 'layp');
//if (s.linkName === 'Feature Used - Local Nav Top') kiwi.trackFeatureClicks(_satellite.getVar('Feature Clicks - Local Nav Top'), 'lnavtop');
if (s.linkName === 'Feature Used - Widget') kiwi.trackFeatureClicks(_satellite.getVar('Feature Clicks - Widget'), 'widget');
if (s.linkName === 'Feature Used - Custom') kiwi.trackFeatureClicks(_satellite.getVar('Feature Clicks - Custom'), 'custom');
if (s.linkName === 'Feature Used - Feature') kiwi.trackFeatureClicks(_satellite.getVar('Feature Clicks - Feature'), 'feature');
}
/* end Feature Clicks */
/* Atlas Widgets */
kiwi.trackWidgetScreenView = function(widgetName, widgetScreenName, blnTrackFeatureViews) {
ruleName = 'kiwi.trackWidgetScreenView';
widgetName = widgetName || '';
widgetScreenName = widgetScreenName || '';
blnTrackFeatureViews = blnTrackFeatureViews || true;
var widgetScreen = widgetScreenName?widgetScreenName:'no-screen-found';
widgetScreen = widgetName+':'+widgetScreen;
if (kiwi._autoshown) {widgetScreen += ':autoshown';}
s.linkTrackVars = s.apl(s.linkTrackVars, 'prop34', ',', 2);
s.prop34 = widgetScreen; //Widget Screen
_satellite.notify(ruleName+ ': ' + widgetScreen);
//Feature Clicks, if not page track
if (s.linkType) {
kiwi.trackFeatureClicks({
hasData: true,
featureType: 'widget',
featureName: widgetName,
featureOptions: [widgetScreenName],
linkTypes: '',
widgetScreen: widgetScreen
}, 'widget');
}
if (blnTrackFeatureViews) {
//Feature Views (and Promos)
kiwi.trackFeatureViews({
hasData: true,
featureType: 'widget:'+widgetName,
featureNames: [widgetScreenName],
widgetName: widgetName,
widgetScreen: widgetScreen,
wireUpOnly: true
}, 'widget:'+widgetName);
}
//reset
kiwi._autoshown = false;
};
if (kiwi.widgetTrack) {//ensure only reporting on widgets ready call
(function(oData) {
if (oData && oData.hasData) {
_satellite.notify('KIWI: Atlas Widgets Data processed: ' + 'JSON.stringify(oData)');
var linkTrackVars = 'events,prop26',
linkTrackEvents = 'event194';
linkTrackVars += oData.widgetLoads?',prop27':'';
linkTrackVars += oData.widgetFails?',prop28':'';
linkTrackVars += oData.widgetServices?',prop23':'';
linkTrackVars += oData.loadSpeed?',eVar91':'';
linkTrackVars += oData.errorType?',prop11,prop12,prop13':'';
linkTrackEvents += oData.widgetServices?',event195':'';
s.linkTrackVars=s.apl(s.linkTrackVars, linkTrackVars, ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, linkTrackEvents, ',', 2);
s.events = s.apl(s.events, linkTrackEvents, ',', 2); //Atlas Widget Ready Calls, Atlas Widget with Service Ready Calls
s.prop26 = oData.widgets; //Atlas Widgets Attempted
s.prop27 = oData.widgetLoads; //Atlas Widgets Loaded
s.prop28 = oData.widgetFails; //Atlas Widgets Failed
s.prop23 = oData.widgetServices; //Atlas Widget Services Requested
if (oData.loadSpeed) s.eVar91 = oData.loadSpeed; //Service Backed Element Load Speed
if (oData.errorType) {
s.prop11 = oData.errorType; //Error Type
s.prop12 = oData.errorCode; //Error Code
s.prop13 = 'D=pageName'; //Page with Error
}
if (oData.widgets.match(/(^|\^)bfcl($|\^)/i)) {
kiwi.trackWidgetScreenView('bfcl','bar', false);
}
}
})(_satellite.getVar('Feature Views - Widgets'));
//update ddl reported flags
Object.keys(kiwi.ddl.atlas).forEach(function (widget) {
this[widget].isNew = false;
if (this[widget].components && typeof this[widget].components === 'object') {
Object.keys(this[widget].components).forEach(function (component) {
this[component].isNew = false;
this[component].serviceStartIndex += this[component].totalNewServices;
this[component].totalNewServices = 0;
//this[component].services = {}; //remove prior reported services so repeat calls get reported
if(this[component].services && typeof this[component].services === 'object') {
Object.keys(this[component].services).forEach(function (service) {
this[service].isNew = false;
}, this[component].services);
}
}, this[widget].components);
}
}, kiwi.ddl.atlas);
}
/* end Atlas Widgets */
/* Internal Searches */
(function(oData){
if (oData && oData.hasData) {
//de-dupe page refreshes
kiwi.util = kiwi.util || {};
var searchDataPersist = {term: oData.term, type: oData.type, facet: oData.facet},
cv = JSON.stringify(searchDataPersist),
pv = kiwi.util.previousValue(cv, 'searchData') || '';
if (cv !== pv) {
s.events = s.apl(s.events, 'event1', ',', 2); //Internal Searches
s.eVar1 = oData.term; //Internal Search Term
s.eVar3 = oData.type; //Internal Search Type
s.prop2 = oData.count; //Total Search Results
s.prop73 = oData.speed; //Search Results Speed
s.eVar52 = oData.facet; //Search Results Facet
if (oData.isQuick) {
s.events = s.apl(s.events, 'event117', ',', 2); //Auto-Suggested Term Searches
s.eVar9 = oData.term; //Auto-Suggested Search Term
}
var oSearchTypes = _satellite.getVar('Kiwi Config - Search Types'),
mySearchTypeEvent = oSearchTypes[oData.type] || oSearchTypes['generic-site'];
if (mySearchTypeEvent) {
s.events = s.apl(s.events, mySearchTypeEvent, ',', 2); //...Various Search Types...
} else if (mySearchTypeEvent.match(/site/i)) {
//generic "site" search
s.events = s.apl(s.events, 'event3', ',', 2); //Site Searches
}
if (s.events.match(/(,|^)event3(,|$)/i)) {
s.eVar35 = 'D=c52'; //Site Search Origin Page
}
}
//Feature Views (and Promos)
kiwi.trackFeatureViews({
hasData: true,
featureType: 'srch',
featureNames: [oData.term]
}, 'srch');
}
//reset Quick search
kiwi.cookie.sess.prev['isQuick'] = false;
kiwi._sessCookieMod = true; //signal sess cookie updates
})(_satellite.getVar('Search Data'));
/* end Internal Searches */
/* Get Site Control Modals */
if (s.pageName.match(/getsitecontrol-/i)) {
s.prop25 = _satellite.getVar('Derived Page Name'); //Page Sending Custom Link
s.list1 = 'D=pageName'; // Promos (CTR)
s.events = s.apl(s.events, 'event98', ',', 2); //Promo Views
}
/* end Get Site Control Modals */
/* CBOS Optins */
if (kiwi._thisPage.siteCode === 'opportunity' &&
kiwi._thisPage.pageCode === 'my-action-plan' &&
kiwi.user.cbId &&
kiwi.user.gradYear.match(/[0-9]{4}/i)) {
s.events = s.apl(s.events, 'event34:'+kiwi.user.cbId+'-'+kiwi.user.gradYear, ',', 2); //CBOS Opt Ins
}
/* end CBOS Optins */
/* Custom Links */
kiwi._elementToTest = kiwi._elementToTest || false;
if (s.linkType) {
s.prop25 = s.pageName; //Page Sending Custom Link
/* URL Processing */
var elem = kiwi._elementToTest,
url = '';
if (elem && elem.href) {
url = elem.href.toLowerCase();
//remove affiliateId/bannerId params
var urlParts = url.split('?');
if (urlParts[1]) {
urlParts[1] = urlParts[1].replace(/&affiliateId(=[^&]*)?|^affiliateId(=[^&]*)?&?/i, '');
urlParts[1] = urlParts[1].replace(/&bannerId(=[^&]*)?|^bannerId(=[^&]*)?&?/i, '');
if (urlParts[1]) url = urlParts.join('?');
else url = urlParts[0];
}
}
/* end URL Processing */
/* Exit Links */
if (s.linkType === 'e' && url) {
s.linkName = url;
s.linkTrackVars = s.apl(s.linkTrackVars, 'prop24', ',', 2);
s.prop24 = url; //Exit Link
s.prop1 = 'EXTLINK|'+s.prop24;
s.linkTrackVars=s.apl(s.linkTrackVars, 'prop24', ',', 2);
}
/* end Exit Links */
/* Download/Dynamic/Triggered Download Links */
if (s.linkType === 'd' && s.linkName === 'Triggered Download Link') {
url = _satellite.getVar('DDL - Download');
}
if ((s.linkType === 'd' && url) ||
(s.linkType === 'o' && s.linkName === 'Dynamic Download Link')) {
if (s.linkType === 'd') {
s.linkName = url;
} else {
url = s.prop32 + '/dynamic-asset/';
if (elem.attributes['data-cbtrack-download']) {
url += elem.attributes['data-cbtrack-download'].value.replace(/:/gi, '-');
} else if (elem.attributes['download']) {
url += elem.attributes['download'].value.replace(/:/gi, '-');
} else if (elem.attributes['dynamic-asset-link-track']) {
url += elem.attributes['dynamic-asset-link-track'].value.replace(/:/gi, '-');
}
s.linkName += ': ' + url;
}
s.linkTrackVars = s.apl(s.linkTrackVars, 'prop10', ',', 2);
s.hier1 = 'D=c10';
s.eVar4 = 'D=c10';
kiwi._urlToParse = url;
kiwi._parsingDownloadLink = true;
s.prop10 = _satellite.getVar('Page Name'); //Download PageName
s.prop1 = 'DOWNLOAD|'+s.prop10;
s.linkTrackVars=s.apl(s.linkTrackVars, 'prop1', ',', 2);
//reset urlToParse after parsed
kiwi._urlToParse = '';
kiwi._parsingDownloadLink = false;
}
/* end Download/Dynamic Download Links */
if (s.linkType === 'o') {
s.linkTrackVars = s.apl(s.linkTrackVars, 'prop1', ',', 2);
s.prop1 = 'CUSTOM|'+s.linkName;
var customLinkActions = {
/* Application Error Link Tracking */
// see DDL > error.json.js for examples of how this feature is used
'Application Error': function() {
var oData = _satellite.getVar('AA - Application Error');
if (oData) {
s.events = s.apl(s.events, 'event193', ',', 2); //Application Errors
s.linkTrackVars=s.apl(s.linkTrackVars, 'events', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event193', ',', 2);
s.prop4 = oData; //Application Error Code/Message
s.prop11 = 'application-error'; //Error Type
s.prop12 = oData.split(':')[0]; //Error Code
s.prop13 = 'D=25'; //Page with Error
s.linkTrackVars=s.apl(s.linkTrackVars, 'prop4', ',', 2);
s.linkTrackVars=s.apl(s.linkTrackVars, 'prop11', ',', 2);
s.linkTrackVars=s.apl(s.linkTrackVars, 'prop12', ',', 2);
s.linkTrackVars=s.apl(s.linkTrackVars, 'prop13', ',', 2);
//TODO: remove promo tracking events and evars
}
//reset data
kiwi.ddl.appError = {};
},
'Cookie Consent Banner': function() {
s.linkTrackVars = s.apl(s.linkTrackVars, 'prop43', ',', 2);
s.prop43 = 'one trust:cookie consent banner';
},
'Promo Click getsitecontrol': function() {
s.events = s.apl(s.events, 'event99', ',', 2); //Promo Clicks
s.list1 = 'D=pageName'; // Promos (CTR)
s.list2 = 'D=pageName'; // Promos (Conv)
s.linkTrackVars = s.apl(s.linkTrackVars, 'events', ',', 2);
s.linkTrackVars = s.apl(s.linkTrackVars, 'list1', ',', 2);
s.linkTrackVars = s.apl(s.linkTrackVars, 'list2', ',', 2);
s.linkTrackEvents = s.apl(s.linkTrackEvents, 'event99', ',', 2);
//modify page name
s.prop25 = _satellite.getVar('Derived Page Name'); //Page Sending Custom Link
},
/* Widget Display Changes (Old Style Widgets) */
'Widget Display Change': function() {
var oData = _satellite.getVar('Data - Widget Display');
s.list1 = ''; //Promos (CTR)
if (oData && oData.screen) {
_satellite.notify('KIWI: Widget Display Data found!');
s.linkTrackVars = s.apl(s.linkTrackVars, 'prop34', ',', 2);
s.prop34 = oData.screen; //Widget Screen
kiwi.lotag = oData.screen; //Lucky Orange Behavior Tag
/* Begin Lucky Orange */
if (kiwi.lotag &&
kiwi.lotag.match(/^(dop-generic|dop-scores-ot|dop-scores-aot)$/i)) {
window._loq = window._loq || []; // ensure queue available
window._loq.push(['tag', kiwi.lotag]); // this will tag, won't star, and will append the tag
}
/* End Lucky Orange */
if (oData.promos) {
s.events = s.apl(s.events, 'event98', ',', 2); //Promo Views
s.events = s.apl(s.events, 'event12', ',', 2); //Internal Campaign Views (legacy)
s.list1 = oData.promos; //Promos (CTR)
s.linkTrackVars = s.apl(s.linkTrackVars, 'events', ',', 2);
s.linkTrackVars = s.apl(s.linkTrackVars, 'list1', ',', 2);
s.linkTrackEvents = s.apl(s.linkTrackEvents, 'event98', ',', 2);
s.linkTrackEvents = s.apl(s.linkTrackEvents, 'event12', ',', 2);
}
if (oData.navs) {
s.linkTrackVars = s.apl(s.linkTrackVars, 'events', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, oData.navs, ',', 2);
s.events = s.apl(s.events, oData.navs, ',', 2); //[xyz] Nav Views
}
}
},
'AP Exam Intent Form Submit': function() {
var oData = _satellite.getVar('Data - AP Exam Intent');
if (oData && oData.hasData) {
_satellite.notify('KIWI: Data - AP Exam Intent found: ' + JSON.stringify(oData));
/**
* pattern: [Poll ID]:[Submitted Date];[AP Exam]:[count each yes/uns/no];[AP YouTube]:[y/n];[AP Prac]:[y/n]
* eg: ap1:20200413;ex:y00|u01|n02;yt:ys;pr:no
*/
s.eVar92 = oData.pollResponse; //SFMC Poll Responses
s.events = s.apl(s.events, 'event192', ',', 2); //SFMC Poll Submissions
s.linkTrackVars=s.apl(s.linkTrackVars, 'events', ',', 2);
s.linkTrackVars=s.apl(s.linkTrackVars, 'eVar92', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event192', ',', 2);
}
},
'Parent Opt In Form Submit': function() {
var oData = _satellite.getVar('Data - Parent Opt In');
if (oData && oData.hasData) {
_satellite.notify('KIWI: Data - Parent Opt In found: ' + JSON.stringify(oData));
s.eVar84 = oData.gradYears; //Parent Opted Grad Years
if (oData.serializeEmail) s.events = s.apl(s.events, 'event114:'+oData.serializeEmail, ',', 2); //Parent Email Opt-Ins
if (oData.serializeText) s.events = s.apl(s.events, 'event115:'+oData.serializeText, ',', 2); //Parent Text Opt-Ins
s.linkTrackVars=s.apl(s.linkTrackVars, 'events,eVar84', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event114,event115', ',', 2);
}
},
'Iframe Report Link': function() {
kiwi.pageCodeOverride = 'reports:' + _satellite.getVar('Data - IFrame Report Name');
s.eVar74 = kiwi._thisPage.siteCode + ':' + kiwi.pageCodeOverride; //BI Report Name
s.events = s.apl(s.events, 'event89', ',', 2); //BI Report Requested
s.linkTrackVars=s.apl(s.linkTrackVars, 'events,eVar74', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event89', ',', 2);
},
'CBOS Terms Accept': function() {
kiwi.util.fireCustomEvent('CBOS Terms Accept');
s.abort = true;
},
'Confirm ECL Account Create': function() {
kiwi.util.fireCustomEvent('Confirm ECL Account Create');
s.abort = true;
},
/* Low Income/Fee Waivers Form Opt Ins/Outs */
'LIFW Opt In Form Submit': function() {
var oData = _satellite.getVar('Data - LIFW Form');
if (oData && oData.hasData) {
var serializeVal = kiwi.user.cbId+'-'+kiwi.user.gradYear;
_satellite.notify('KIWI: Data - LIFW Form found: ' + JSON.stringify(oData));
if (oData.liQualOption) s.events = s.apl(s.events, 'event35:'+serializeVal, ',', 2); //LIFW Opt Ins
else s.events = s.apl(s.events, 'event36:'+serializeVal, ',', 2); //LIFW Opt Outs
s.linkTrackVars=s.apl(s.linkTrackVars, 'events', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event35,event36', ',', 2);
}
},
/* Low Income/Fee Waivers Link Opt Ins */
'LIFW Opt In': function() {
var serializeVal = kiwi.user.cbId+'-'+kiwi.user.gradYear;
s.events = s.apl(s.events, 'event35:'+serializeVal, ',', 2); //LIFW Opt Ins
s.linkTrackVars=s.apl(s.linkTrackVars, 'events', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event35', ',', 2);
},
/* Low Income/Fee Waivers Link Opt Outs */
'LIFW Opt Out': function() {
var serializeVal = kiwi.user.cbId+'-'+kiwi.user.gradYear;
s.events = s.apl(s.events, 'event36:'+serializeVal, ',', 2); //LIFW Opt Outs
s.linkTrackVars=s.apl(s.linkTrackVars, 'events', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event36', ',', 2);
},
/* CBOS DCR Link Track Events */
// see DDL > CBOS > my-action-plan.json.js for details
'CBOS - FAFSA Confirm': function() {
var serializeVal = kiwi.user.cbId+'-'+kiwi.user.gradYear;
s.events = s.apl(s.events, 'event132:'+serializeVal, ',', 2); //CBOS Students - Complete FAFSA
s.linkTrackVars=s.apl(s.linkTrackVars, 'events', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event132', ',', 2);
//Reset Event DDL!
kiwi.ddl.event.cbosFafsaConfirm = null;
},
'CBOS - Colleges Apply': function() {
var oData = _satellite.getVar('Data - CBOS - Colleges Apply');
//expecting: oData = {hasData, isNowFulfilled, collegesCount, collegeNames (pipe-sep)}
if (oData && oData.hasData) {
if (oData.isNowFulfilled) {
var serializeVal = kiwi.user.cbId+'-'+kiwi.user.gradYear;
s.events = s.apl(s.events, 'event133:'+serializeVal, ',', 2); //CBOS Students - Apply to Colleges
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event133', ',', 2);
}
s.events = s.apl(s.events, 'event134='+oData.collegesCount, ',', 2); //CBOS College Applications
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event134', ',', 2);
s.linkTrackVars=s.apl(s.linkTrackVars, 'events', ',', 2);
s.prop22 = oData.collegeNames; //CBOS College Application Added
s.linkTrackVars=s.apl(s.linkTrackVars, 'prop22', ',', 2);
}
},
'CBOS - Low Income Opt In': function() {
var serializeVal = kiwi.user.cbId+'-'+kiwi.user.gradYear;
s.events = s.apl(s.events, 'event35:'+serializeVal, ',', 2); //LIFW Opt Ins
s.linkTrackVars=s.apl(s.linkTrackVars, 'events', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event35', ',', 2);
//Reset Event DDL!
kiwi.ddl.event.cbosLowIncomeOptIn = null
},
'CBOS - Low Income Opt Out': function() {
var serializeVal = kiwi.user.cbId+'-'+kiwi.user.gradYear;
s.events = s.apl(s.events, 'event36:'+serializeVal, ',', 2); //LIFW Opt Outs
s.linkTrackVars=s.apl(s.linkTrackVars, 'events', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event36', ',', 2);
//Reset Event DDL!
kiwi.ddl.event.cbosLowIncomeOptIn = null
},
/* Site Search Links */
'Site Search Link': function() {
s.events = s.apl(s.events, 'event10', ',', 2); //Search Results Clicks
s.linkTrackVars = s.apl(s.linkTrackVars, 'events', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event10', ',', 2);
kiwi._urlToParse = url;
s.eVar55 = _satellite.getVar('Page Name'); //Search Results Link
//reset urlToParse after parsed
kiwi._urlToParse = '';
s.linkTrackVars = s.apl(s.linkTrackVars, 'eVar55', ',', 2);
s.linkName += ': ' + url;
if (elem.attributes['data-cb-adcode']) var featureUsed = elem.attributes['data-cb-adcode'].value;
else if (elem.attributes['trackclickvalue']) var featureUsed = elem.attributes['trackclickvalue'].value;
if(featureUsed) {
s.linkTrackVars = s.apl(s.linkTrackVars, 'prop43', ',', 2);
s.prop43 = 'sitesearch-banner:' + featureUsed;
}
},
/* Search Results Clicks */
'Search Result Click': function() {
var searchDataPersist = JSON.parse(kiwi.cookie.sess.prev.searchData);
var term = decodeURIComponent(searchDataPersist.term),
type = decodeURIComponent(searchDataPersist.type),
facet = decodeURIComponent(searchDataPersist.facet);
if (term) {
s.events = s.apl(s.events, 'event10', ',', 2); //Search Results Clicks
s.linkTrackVars = s.apl(s.linkTrackVars, 'events', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event10', ',', 2);
kiwi._urlToParse = url;
s.eVar55 = _satellite.getVar('Page Name'); //Search Results Link
//reset urlToParse after parsed
kiwi._urlToParse = '';
s.linkTrackVars = s.apl(s.linkTrackVars, 'eVar55', ',', 2);
s.eVar1 = term; //Internal Search Term
s.linkTrackVars = s.apl(s.linkTrackVars, 'eVar1', ',', 2);
if (document.querySelector('[data-cbtrack-autosuggtermused]')) {
s.eVar9 = term; //Auto-Suggested Search Term
s.linkTrackVars = s.apl(s.linkTrackVars, 'eVar9', ',', 2);
}
s.eVar3 = type; //Internal Search Type
s.linkTrackVars = s.apl(s.linkTrackVars, 'eVar3', ',', 2);
s.eVar52 = facet; //Search Results Facet
s.linkTrackVars = s.apl(s.linkTrackVars, 'eVar52', ',', 2);
//Feature & Promo Clicks
var ssPromoVal = '';
if (kiwi._elementToTest && kiwi._elementToTest.getAttribute('data-kiwi-sspromo-link')) {
ssPromoVal = kiwi._elementToTest.getAttribute('data-kiwi-sspromo-link');
}
kiwi.trackFeatureClicks({
hasData: true,
featureType: 'srch',
featureName: term,
featureOptions: '',
linkTypes: '',
ssPromoName: ssPromoVal
}, 'srch');
}
},
/* Auto-Suggested Term Search Links */
'Auto-Suggested Term Search Link': function() {
kiwi.cookie.sess.prev['isQuick'] = true;
kiwi._sessCookieMod = true; //signal sess cookie updates
s.abort = true;
},
/**
* Feature Actions
* Configured by jbeach on 2019-05-03
* https://jira.collegeboard.org/browse/WAP-2509
*/
'Feature Action - Storyline': function() {
s.prop43 = 'storyline:' + _satellite.getVar('AppData Action Code');
s.linkTrackVars = s.apl(s.linkTrackVars, 'prop43', ',', 2);
},
/* Feature Clicks */
'Feature': function() {
var elem = kiwi._elementToTest;
s.prop43 = s.prop7 + '|' + kiwi.util.makeLinkName(elem);
s.linkTrackVars = s.apl(s.linkTrackVars, 'prop43', ',', 2);
},
/* Video Play Events*/
/*'': function() {
/**
* Orig provided by Wilder Freed (Adobe consultant) in 2019-01
* Configured by jbeach on 2019-03-11
*/
/* example data passed in
kiwi.videoData = {
mediaName: mediaName,
player: 'YouTube',
linkName: 'Video 25%'
};
var oVidData = kiwi.videoData;
kiwi.videoData = {};
var oEventMapping = {
'Video Start': 'event52',
'Video 25%': 'event60',
'Video 50%': 'event61',
'Video 75%': 'event62',
'Video Complete': 'event53'
};
s.linkTrackEvents=s.apl(s.linkTrackEvents, oEventMapping[oVidData.linkName], ',', 2);
s.events = s.apl(s.events, oEventMapping[oVidData.linkName], ',', 2);
s.linkTrackVars = s.apl(s.linkTrackVars, 'events, eVar56, eVar58', ',', 2);
s.eVar56 = oVidData.mediaName;
s.eVar58 = oVidData.player;
},*/
/* Target Link Clicks */
'Target Link Click': function() {
s.linkTrackVars = s.apl(s.linkTrackVars, 'prop43', ',', 2);
},
/* Generic Custom Event Tracking */
'Custom Event Name': function() {
s.linkTrackVars=s.apl(s.linkTrackVars, 'events', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, _satellite.getVar('Custom Event Code'), ',', 2);
s.events = s.apl(s.events, s.linkTrackEvents, ',', 2);
//reset data
_satellite.setVar('Custom Event Name', '');
_satellite.setVar('Custom Event Code', '');
},
/* Fake Conversions */
'Fake Conversion': function() {
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event27,event28,event29', ',', 2);
s.events = s.apl(s.events, 'event27,event28=1,event29=1', ',', 2); //Fake Conversions
},
/* IAM Account Link Approvals */
'Approve Account Link': function() {
s.linkTrackVars=s.apl(s.linkTrackVars, 'events', ',', 2);
if (s.pageName.match(/khan_academy/i)) {
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event87', ',', 2);
s.events = s.apl(s.events, 'event87', ',', 2); //Khan Account Links
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event87', ',', 2);
kiwi.util.fireCustomEvent('Khan Account Linked');
}
if (s.pageName.match(/academic_merit/i)) {
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event105', ',', 2);
s.events = s.apl(s.events, 'event105', ',', 2); //Academic Merit Links
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event105', ',', 2);
}
if (s.pageName.match(/rtnation/i)) {
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event106', ',', 2);
s.events = s.apl(s.events, 'event106', ',', 2); //Road Trip Nation Links
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event106', ',', 2);
}
if (s.pageName.match(/collegenet/i)) {
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event131', ',', 2);
s.events = s.apl(s.events, 'event131', ',', 2); //College Net/Coalition Links
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event131', ',', 2);
}
},
'Accuplacer Practice - Test Registration': function() {
if (cbTrackData.accupracRegType) {
s.linkTrackVars=s.apl(s.linkTrackVars, 'events,eVar33', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event94', ',', 2);
s.eVar33 = cbTrackData.accupracRegType;
s.events = s.apl(s.events, 'event94:' + (cbTrackData.accupracUserId || ''), ',', 2); //Accuplacer Practice Test Registrations
}
},
'SpringBoard Digital - Assignment Made': function() {
s.linkTrackVars=s.apl(s.linkTrackVars, 'events,eVar71', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event84', ',', 2);
s.eVar71 = _satellite.getVar('AppData Assignment Type'); //SpringBoard Digital Assignment Types
s.events = s.apl(s.events, 'event84', ',', 2); //SpringBoard Digital Assignments
},
'SpringBoard Digital - Lesson Plan Made': function() {
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event85', ',', 2);
s.events = s.apl(s.events, 'event85', ',', 2); //SpringBoard Digital Lesson Plans
},
/* Legacy Big Future */
'BF: Action Plan Grade Select': function() {
var oData = _satellite.getVar('BF Action Plan Grade Select Data');
if (oData) {
s.linkTrackVars=s.apl(s.linkTrackVars, 'events,eVar59', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event65', ',', 2);
s.eVar59 = oData.grade; //Action Plan Grad Year
s.events = s.apl(s.events, 'event65', ',', 2); //Action Plans Started
}
//reset data
_satellite.setVar('BF Action Plan Grade Select Data', '');
},
'Scholarship Search Results Click': function() {
s.linkTrackVars=s.apl(s.linkTrackVars, 'events', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event26', ',', 2);
s.events = s.apl(s.events, 'event26', ',', 2); //Scholarship Searches
},
//locally scoped IIFE function - can't access :(
'bf-mobi:link': function() {
s.abort = true;
},
/* end Legacy Big Future */
'Widget Screen - BFCL Widget': function() {
var elBfcl = document.querySelector('[data-cbtrack-widget="bfcl"]'),
elMsg = '', strName = '';
if (elBfcl) {elMsg = elBfcl.querySelector('.college-list-popover-container[data-cbtrack-linkgroup]');}
if (elMsg) {strName = elMsg.getAttribute('data-cbtrack-linkgroup');}
kiwi.trackWidgetScreenView('bfcl',strName, true);
},
'BFCL Widget - Popover Dismissed': function() {
kiwi.trackWidgetScreenView('bfcl','popover-dismissed', false);
},
'BFCL Widget - Login Modal': function() {
kiwi.trackWidgetScreenView('bfcl','login-modal', false);
},
'cbTrack.sssOptin': function() {
s.linkTrackVars=s.apl(s.linkTrackVars, 'events', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event59', ',', 2);
s.events = s.apl(s.events, 'event59:' + kiwi.cookie.sess.user.cbId, ',', 2); //SSS Opt-Ins
_satellite.notify('KIWI: Custom Event Tracked: SSS Opt Ins: event59:' + kiwi.cookie.sess.user.cbId);
},
'cbTrack.sssReOptin': function() {
s.linkTrackVars=s.apl(s.linkTrackVars, 'events', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event196', ',', 2);
s.events = s.apl(s.events, 'event196:' + kiwi.cookie.sess.user.cbId, ',', 2); //SSS re-Opt-Ins
_satellite.notify('KIWI: Custom Event Tracked: SSS re-Opt Ins: event196:' + kiwi.cookie.sess.user.cbId);
},
'cbTrack.sssOptOut': function() {
s.linkTrackVars=s.apl(s.linkTrackVars, 'events', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event140', ',', 2);
s.events = s.apl(s.events, 'event140:' + kiwi.cookie.sess.user.cbId, ',', 2); //SSS Opt-Outs
_satellite.notify('KIWI: Custom Event Tracked: SSS Opt Outs: event140:' + kiwi.cookie.sess.user.cbId);
},
'cbTrack.sssOptout': function() {
s.linkTrackVars=s.apl(s.linkTrackVars, 'events', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event140', ',', 2);
s.events = s.apl(s.events, 'event140:' + kiwi.cookie.sess.user.cbId, ',', 2); //SSS Opt-Outs
_satellite.notify('KIWI: Custom Event Tracked: SSS Opt Outs: event140:' + kiwi.cookie.sess.user.cbId);
},
'HEDR - FAS - Download': function() {
if (kiwi._hedr_fas_download.eventCode) {
s.events = s.apl(s.events, kiwi._hedr_fas_download.eventCode+'='+kiwi._hedr_fas_download.total, ',', 2); //HEDR FAS Downloads
s.linkTrackVars=s.apl(s.linkTrackVars, 'events', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, kiwi._hedr_fas_download.eventCode, ',', 2);
_satellite.notify('KIWI: Custom Event Tracked: HEDR - FAS - Download: ' + kiwi._hedr_fas_download.eventCode+'='+kiwi._hedr_fas_download.total);
}
},
'HEDR - Report View': function() {
if (kiwi._hedr_report_view.eventCode) {
s.events = s.apl(s.events, kiwi._hedr_report_view.eventCode, ',', 2); //HEDR Report Views
s.prop39 = kiwi._hedr_report_view.report; //App Data Custom 1: HEDR Report
s.prop40 = kiwi._hedr_report_view.sy; //App Data Custom 2: HEDR Report Year
s.prop41 = kiwi._hedr_report_view.type; //App Data Custom 3: HEDR Report Type
s.prop42 = kiwi._hedr_report_view.source; //App Data Custom 4: HEDR Report View Source
s.linkTrackVars=s.apl(s.linkTrackVars, 'events', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, kiwi._hedr_report_view.eventCode, ',', 2);
s.linkTrackVars=s.apl(s.linkTrackVars, 'prop39', ',', 2);
s.linkTrackVars=s.apl(s.linkTrackVars, 'prop40', ',', 2);
s.linkTrackVars=s.apl(s.linkTrackVars, 'prop41', ',', 2);
s.linkTrackVars=s.apl(s.linkTrackVars, 'prop42', ',', 2);
_satellite.notify('KIWI: Custom Event Tracked: HEDR - Report View: ' + JSON.stringify(kiwi._hedr_report_view));
}
},
'HEDR - Data File - Download': function() {
if (kiwi._hedr_files_download.eventCodeA) {
s.events = s.apl(s.events, kiwi._hedr_files_download.eventCodeA, ',', 2); //HEDR Data Files Downloads
s.events = s.apl(s.events, kiwi._hedr_files_download.eventCodeB+'='+kiwi._hedr_files_download.count, ',', 2); //HEDR Data Files Downloads
s.prop40 = kiwi._hedr_files_download.type; //App Data Custom 2: HEDR Data Files Type
s.prop41 = kiwi._hedr_files_download.delivMethod; //App Data Custom 3: HEDR Data Files Delivery Method
s.prop42 = kiwi._hedr_files_download.auditCount; //App Data Custom 4: HEDR Data Files Audit Count
s.linkTrackVars=s.apl(s.linkTrackVars, 'events', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, kiwi._hedr_files_download.eventCodeA, ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, kiwi._hedr_files_download.eventCodeB, ',', 2);
s.linkTrackVars=s.apl(s.linkTrackVars, 'prop40', ',', 2);
s.linkTrackVars=s.apl(s.linkTrackVars, 'prop41', ',', 2);
s.linkTrackVars=s.apl(s.linkTrackVars, 'prop42', ',', 2);
_satellite.notify('KIWI: Custom Event Tracked: HEDR - Data File - Download: ' + JSON.stringify(kiwi._hedr_files_download));
}
},
'cbTrack.modalView': function() {
kiwi = window.kiwi || {};
var modals = document.querySelectorAll('[data-cbtrack-modal]');
for (var i = 0; i < modals.length; i++) {
var modal = modals[i],
modalName = 'unknown-modal-name',
modalContent = modal.querySelector('.modal-content');
if (kiwi.util.elementIsVisible(modal) ||
(modalContent && kiwi.util.elementIsVisible(modalContent))) {
modalName = modal.getAttribute('data-cbtrack-modal');
break;
}
}
_satellite.notify('KIWI: cbTrack.modalView: ' + modalName);
if (modalName) {
s.prop34 = 'modal:'+modalName; //Widget/Modal Screen
s.linkTrackVars = s.apl(s.linkTrackVars, 'prop34', ',', 2);
s.linkTrackVars = s.apl(s.linkTrackVars, 'prop1', ',', 2);
s.prop1 = 'MODAL|' +modalName;
modalName = false;
}
}
};
if (customLinkActions[s.linkName]) customLinkActions[s.linkName]();
/* Search */
if (s.linkName.match(/^Search - /i)) {
s.linkTrackVars=s.apl(s.linkTrackVars, 'prop2,eVar1,eVar3,events', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event1,event3,event4,event26,event49,event63,event64', ',', 2);
}
/* end Search */
}
}
/* end Custom Links */
/* College Profile Views */
var oData = _satellite.getVar('College Profile View Data');
if (oData && oData.event22) {
_satellite.notify('KIWI: College Profile View Data found! Events: ' + oData.event22);
s.events = s.apl(s.events, 'event22', ',', 2); //College Profile Views
//reset data
window.s.events = '';
}
/* end College Profile Views */
/* CAFW Printed */
var oData = _satellite.getVar('Data - CAFW Printed');
if (oData && oData.hasData) {
_satellite.notify('KIWI: Data - CAFW Printed found: ' + JSON.stringify(oData));
s.events = s.apl(s.events, oData.events, ',', 2); //CAFW Printed
}
/* end CAFW Printed */
/* BI Report Events */
if (s.linkType === 'o' && (_satellite.getVar('Report Load Start') || _satellite.getVar('Report Load Partial'))) {
s.linkTrackVars=s.apl(s.linkTrackVars, 'events,eVar74', ',', 2);
s.eVar74 = 'D=c25'; //Report Name
if (_satellite.getVar('Report Load Start')) {
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event89', ',', 2);
s.events = s.apl(s.events, 'event89', ',', 2); //BI Report Requested
s.pageName = decodeURIComponent(s.prop52); // this ensures previous page pathing works on final page load
_satellite.setVar('Report Loading Page Name', s.pageName);
}
if (_satellite.getVar('Report Load Partial')) {
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event100', ',', 2);
s.events = s.apl(s.events, 'event100', ',', 2); //BI Report Partially Loaded
s.pageName = _satellite.getVar('Report Loading Page Name'); // this ensures previous page pathing works on final page load
_satellite.setVar('Report Loading Page Name', '');
}
//reset de after track
_satellite.setVar('Report Load Start', false);
_satellite.setVar('Report Load Partial', false);
}
if (_satellite.getVar('Report Load Complete')) {
s.eVar74 = 'D=pageName'; //Report Name
s.events = s.apl(s.events, 'event101', ',', 2); //BI Report Completed
if (s.prop74) s.events = s.apl(s.events, 'event112=' + s.prop74, ',', 2); //BI Report Load Speed
//reset de after track
_satellite.setVar('Report Load Complete', false);
_satellite.setVar('Report Load Speed', '');
}
/* end BI Report Events */
/* SpringBoard Digital */
if (_satellite.textMatch(_satellite.getVar('AppData Site Code'), 'springboarddigital')) {
if (s.pageName == 'springboarddigital:landingpage') {
//var visitor = Visitor.getInstance('5E1B123F5245B29B0A490D45@AdobeOrg');
//var mcvid = visitor.getMarketingCloudVisitorID();
var sbDigLoginEvent = 'event83'; //records once per visit in configuration
s.events = s.apl(s.events, sbDigLoginEvent, ',', 2); //SpringBoard Digital Logins
}
}
/* end SpringBoard Digital */
/* eCommerce Purchases */
(function(){
var oData = _satellite.getVar('DDL - ECommerce - Purchase');
if (oData) {
_satellite.notify('KIWI: eCommerce Purchase Data found! :: Data Found: ' + JSON.stringify(oData));
s.events = s.apl(s.events, 'purchase', ',', 2); //Orders
s.purchaseID = oData.transaction.id; //Purchase ID
s.eVar16 = oData.transaction.type; //Order Type (e.g. Event Registration)
s.eVar37 = oData.transaction.type; //Product View Source (e.g. Event Registration)
for(var i = 0; i < oData.products.length; i++) {
var oProduct = oData.products[i];
product = oProduct.category + ';' + oProduct.id + ';' + oProduct.quantity + ';' + oProduct.price;
s.products = s.apl(s.products, product, ',', 2); //Products
}
s.linkTrackVars = s.apl(s.linkTrackVars, 'events', ',', 2);
s.linkTrackVars = s.apl(s.linkTrackVars, 'eVar16', ',', 2);
s.linkTrackVars = s.apl(s.linkTrackVars, 'eVar37', ',', 2);
s.linkTrackVars = s.apl(s.linkTrackVars, 'purchaseID', ',', 2);
s.linkTrackVars = s.apl(s.linkTrackVars, 'products', ',', 2);
_satellite.notify('KIWI: '+oData.transaction.type+'!');
var deduper = oData.transaction.id,
count = 0;
switch (oData.transaction.type) {
case 'Event Registration':
s.events = s.apl(s.events, 'event23:'+deduper, ',', 2); //Event Registrations
s.eVar62 = oData.products[0].name; //Event Name
s.eVar68 = oData.products[0].category; //Event Type
s.linkTrackEvents = s.apl(s.linkTrackEvents, 'event23', ',', 2);
s.linkTrackVars = s.apl(s.linkTrackVars, 'eVar62', ',', 2);
s.linkTrackVars = s.apl(s.linkTrackVars, 'eVar68', ',', 2);
break;
case 'SAT Score Sends':
deduper = 'nsat'+deduper;
s.purchaseID = deduper; //Purchase ID
s.events = s.apl(s.events, 'event205:'+deduper, ',', 2); //SAT Score Sends - All
s.linkTrackEvents = s.apl(s.linkTrackEvents, 'event205', ',', 2);
if (oData.transaction.shipping) {
s.events = s.apl(s.events, 'event209:'+deduper, ',', 2); //SAT Score Sends - Rush
s.linkTrackEvents = s.apl(s.linkTrackEvents, 'event209', ',', 2);
}
var oData2 = _satellite.getVar('DDL - SAT Score Sends');
if (oData2 && oData2.flow) {
s.prop70 = Object.keys(oData2.schoolsSelected).join(',');
s.linkTrackVars = s.apl(s.linkTrackVars, 'prop70', ',', 2);
count = Object.keys(oData2.schoolsSelected).length;
s.events = s.apl(s.events, 'event210:'+deduper+'='+count, ',', 2); //SAT Score Recipients - Orgs
s.linkTrackEvents = s.apl(s.linkTrackEvents, 'event210', ',', 2);
if (oData2.flow === 'reg') {
s.events = s.apl(s.events, 'event206:'+deduper, ',', 2); //SAT Score Sends - Reg
s.linkTrackEvents = s.apl(s.linkTrackEvents, 'event206', ',', 2);
}
if (oData2.flow === 'asr') {
s.events = s.apl(s.events, 'event207:'+deduper, ',', 2); //SAT Score Sends - ASR
s.linkTrackEvents = s.apl(s.linkTrackEvents, 'event207', ',', 2);
}
if (oData2.fyType && oData2.fyType !== 'none') {
s.events = s.apl(s.events, 'event208:'+deduper, ',', 2); //SAT Score Sends - FW Used
s.linkTrackEvents = s.apl(s.linkTrackEvents, 'event208', ',', 2);
}
}
if (kiwi.ddl.satScoreSends) {kiwi.ddl.satScoreSends = '';}
break;
default:
break;
}
if (kiwi.ddl.eCommerce.purchase) {kiwi.ddl.eCommerce.purchase = '';}
}
})();
/* end eCommerce Purchases */
/* CSS/PROFILE Registrations */
var oCSSPReg = _satellite.getVar('SCode CSS/Profile Registration Event Data');
if (oCSSPReg && oCSSPReg.event11) {
_satellite.notify('KIWI: CSS/Profile Registration Event Data found!');
s.events = s.apl(s.events, oCSSPReg.event11, ',', 2); //CSS/PROFILE Registrations
s.eVar66 = oCSSPReg.cssProfileYear; //CSS/PROFILE Year
}
/* end CSS/PROFILE Registrations */
/* CSS/PROFILE Application Submissions */
var oCSSPSub = _satellite.getVar('SCode CSS/Profile Application Submission Event Data');
if (oCSSPSub && oCSSPSub.event81) {
_satellite.notify('KIWI: CSS/Profile Application Submission Event Data found!');
s.events = s.apl(s.events, oCSSPSub.event81, ',', 2); //CSS/PROFILE Application Submissions
s.eVar66 = oCSSPSub.cssProfileYear; //CSS/PROFILE Year
s.events = s.apl(s.events, 'purchase', ',', 2); //Orders
s.eVar16 = oCSSPSub.orderType; //Order Type
s.purchaseID = oCSSPSub.purchaseId; //Purchase ID
s.products = oCSSPSub.products; //Products
}
/* end CSS/PROFILE Application Submissions */
/* CLEP Registrations */
var oCLEPReg = _satellite.getVar('SCode CLEP Registration Event Data');
if (oCLEPReg && oCLEPReg.event16) {
_satellite.notify('KIWI: CLEP Registration Event Data found!');
s.events = s.apl(s.events, oCLEPReg.event16, ',', 2); //CLEP Registrations
s.events = s.apl(s.events, 'purchase', ',', 2); //Orders
s.eVar16 = oCLEPReg.orderType; //Order Type
s.purchaseID = oCLEPReg.purchaseId; //Purchase ID
s.products = oCLEPReg.products; //Products
kiwi.util.fireCustomEvent('CLEP Registration');
}
/* end CLEP Registrations */
/* SAT Reg Flow Tracking */
var arrStepEvent = '';
(function(oData) {
if (oData && oData.hasData) {
_satellite.notify('KIWI: SAT Reg Step Data found: ' + JSON.stringify(oData));
for (var i = 0; i < oData.stepEvents.length; i++) {
s.events = s.apl(s.events, oData.stepEvents[i], ',', 2); // SAT Reg Flow Milestones (unique by Reg), (unique by SY+User)
arrStepEvent = oData.stepEvents[i].split(':');
var stepEvent;
if (arrStepEvent.length) {
stepEvent = arrStepEvent[0];
kiwi.util.fireCustomEvent('SAT Reg Step', {stepEvent: stepEvent});
}
}
}
})(_satellite.getVar('Data - SAT Reg Step'));
/* end SAT Reg Flow Tracking */
/* SAT Cross-Sell Prod View Tracking */
(function(oData) {
if (oData && oData.hasData) {
_satellite.notify('KIWI: Data - SAT Reg Cross-Sell found: ' + JSON.stringify(oData));
s.events = s.apl(s.events, 'prodView', ',', 2); // Product Views
s.eVar37=oData.prodViewSource;
s.products=oData.products;
}
})(_satellite.getVar('Data - SAT Reg Cross-Sell'));
/* end SAT Cross-Sell Prod View Tracking */
/* Test Order Tracking */
(function(oData) {
if (oData && oData.hasData &&
s.pageName.match(/ordering\/testordering\/submitorder/i)) {
_satellite.notify('KIWI: Data - Test Order found: ' + JSON.stringify(oData));
s.eVar8 = oData.aiCode; //App User Org ID
s.eVar53 = oData.adminCode; //Test Order Admin
s.events = s.apl(s.events, 'event48:'+oData.serializeCode, ',', 2); // Test Orders
}
})(_satellite.getVar('Data - Test Order'));
/* end Test Order Tracking */
/* SAT Reg Tracking */
(function(oData) {
if (oData && oData.hasData) {
_satellite.notify('KIWI: Data - SAT Reg found: ' + JSON.stringify(oData));
s.eVar16 = oData.orderType; //Order Type
s.purchaseID = oData.purchaseId; //Purchase ID
s.products = oData.products; //Products
s.eVar26 = oData.testType; //SAT Test Type
s.eVar40 = oData.registrantType; //SAT Registrant Type
s.eVar49 = oData.adminCode; //SAT Reg Admin
s.eVar86 = _satellite.getVar('AA - SAT Fee Waiver Type');
s.events = s.apl(s.events, oData.events.join(','), ',', 2); // Purchase, SAT Regs by Type
if (arrStepEvent.length) {
var isSubjTest = (oData.testType === 'SAT Subject'),
isRepeat = (oData.registrantType === 'Repeat'),
usedFeeWaiver = (s.events.match(/event50(,|:|$)/i));
kiwi.util.fireCustomEvent('SAT Reg', {adminType: oData.adminType, isSubjTest: isSubjTest, isRepeat: isRepeat, usedFeeWaiver: usedFeeWaiver, satRegAdminDate: oData.adminCode, purchaseId: oData.purchaseId});
}
}
})(_satellite.getVar('Data - SAT Reg'));
/* end SAT Reg Tracking */
/* Other NSAT Purchase Tracking */
(function(oData) {
if (oData && oData.hasData) {
_satellite.notify('KIWI: Data - NSAT Purchase found: ' + JSON.stringify(oData));
s.eVar16 = oData.orderType; //Order Type
s.purchaseID = oData.purchaseId; //Purchase ID
s.products = oData.products; //Products
s.eVar26 = oData.testType; //SAT Test Type
s.eVar40 = oData.registrantType; //SAT Registrant Type
s.eVar49 = oData.adminCode; //SAT Reg Admin
s.events = s.apl(s.events, oData.events, ',', 2); // Purchase, Score Sends, QAS/SAS
}
})(_satellite.getVar('Data - NSAT Purchase'));
/* end Other NSAT Purchase Tracking */
/* AP FYM Event Tracking */
/* DDL SCHEMA
{
hasData: true,
apReg: {
hasData: false,
studentId: apReg.studentId || '',
studentOrgId: apReg.studentOrgId || '',
studentGradeLevel: apReg.studentGradeLevel || ''
},
apCourse: {
hasData: false,
apCourseIds: apCourse.apCourseIds || '',
educationPeriod: apCourse.educationPeriod || '',
studentIds: apCourse.studentIds || '',
courseOrgId: apCourse.courseOrgId || ''
},
apExam: {
hasData: false,
apCourseIds: apExam.apCourseIds || '',
educationPeriod: apExam.educationPeriod || '',
studentIds: apExam.studentIds || '',
courseOrgId: apExam.courseOrgId || ''
}
} */
var oData = _satellite.getVar('Data - AP FYM Event');
if (oData && oData.hasData) {
_satellite.notify('KIWI: Data - AP FYM Event found: ' + JSON.stringify(oData));
if (oData.apReg.hasData) {
var sApEventDedupeKey = oData.apReg.studentId;
s.eVar77 = oData.apReg.studentGradeLevel; //AP Student Grade Level
s.events = s.apl(s.events, 'event31:'+sApEventDedupeKey, ',', 2); //AP Student Registrants
}
if (oData.apCourse.hasData) {
//loop courses first
for (var i = 0; i <= oData.apCourse.apCourseIds.length-1; i++) {
var sApCourseInst = oData.apCourse.apCourseIds[i] + '-' + oData.apCourse.educationPeriod;
s.eVar79 = sApCourseInst + '-' + oData.apCourse.courseOrgId; //AP Course Offering
//loop students
for (var j = 0; j <= oData.apCourse.studentIds.length-1; j++) {
var sApEventDedupeKey = oData.apCourse.studentIds[j] + '-' + sApCourseInst;
s.events = s.apl(s.events, 'event32:'+sApEventDedupeKey, ',', 2); //AP Course Enrollees
}
}
}
if (oData.apExam.hasData) {
//loop courses first
for (var i = 0; i <= oData.apExam.apCourseIds.length-1; i++) {
var sApCourseInst = oData.apExam.apCourseIds[i] + '-' + oData.apExam.educationPeriod;
s.eVar79 = sApCourseInst + '-' + oData.apExam.courseOrgId; //AP Course Offering
//loop students
for (var j = 0; j <= oData.apExam.studentIds.length-1; j++) {
var sApEventDedupeKey = oData.apExam.studentIds[j] + '-' + sApCourseInst;
s.events = s.apl(s.events, 'event33:'+sApEventDedupeKey, ',', 2); //AP Exam Registrants
}
}
}
s.linkTrackVars=s.apl(s.linkTrackVars, 'events,eVar77,eVar79', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event31,event32,event33', ',', 2);
}
/* end AP FYM Event Tracking */
/* AP Score View Tracking */
var oData = _satellite.getVar('Data - AP Score View');
if (oData && oData.hasData) {
_satellite.notify('KIWI: Data - AP Score View found: ' + JSON.stringify(oData));
s.events = s.apl(s.events, oData.event78, ',', 2); //AP Score Views
s.eVar65 = oData.eVar65; //AP Score View Year
}
/* end AP Score View Tracking */
/* AP Score Send Tracking */
var oData = _satellite.getVar('Data - AP Score Send');
if (oData && oData.hasData) {
_satellite.notify('KIWI: Data - AP Score Send found: ' + JSON.stringify(oData));
s.events = s.apl(s.events, oData.event79, ',', 2); //AP Score Sends
s.eVar16 = oData.orderType; //Order Type
s.purchaseID = oData.purchaseId; //Purchase ID
s.products = oData.products; //Products
}
/* end AP Score Send Tracking */
/* AP Score Match Tracking */
var oData = _satellite.getVar('Data - AP Score Match');
if (oData && oData.hasData) {
_satellite.notify('KIWI: Data - AP Score Match found: ' + JSON.stringify(oData));
s.events = s.apl(s.events, oData.event77, ',', 2); //AP Score Matches
}
/* end AP Score Match Tracking */
/* IAM Score Match Tracking */
var oData = _satellite.getVar('Data - IAM Score Match');
if (oData && oData.hasData) {
_satellite.notify('KIWI: Data - IAM Score Match found: ' + JSON.stringify(oData));
s.events = s.apl(s.events, oData.events, ',', 2); //IAM Score Matches
s.eVar69 = oData.matchAttempts; //IAM Score Match Attempts
s.eVar70 = oData.matchMethod; //IAM Score Match Method
s.eVar73 = oData.matchTestType; //IAM Score Match Test Type
}
/* end IAM Score Match Tracking *
/* Store Tracking */
//Store Item Views
if (!s.products && s.prop31) {
s.products = ';' + s.prop31; //Products
s.events = s.apl(s.events, 'prodView', ',', 2); //Product Views
}
//Store Purchases
var oSTOPurch = _satellite.getVar('SCode Store Purchase Event Data');
if (oSTOPurch && oSTOPurch.event47) {
_satellite.notify('KIWI: SCode Store Purchase Event Data found!');
s.events = s.apl(s.events, oSTOPurch.event47, ',', 2); //Store Orders
s.events = s.apl(s.events, 'purchase', ',', 2); //Orders
s.eVar16 = oSTOPurch.orderType; //Order Type
s.purchaseID = oSTOPurch.purchaseId; //Purchase ID
s.products = oSTOPurch.products; //Products
}
/* end Store Tracking */
/* Marketing Channels/Campaigns */
kiwi._thisPage.mktg = {
channel: '',
campaign: '',
mid: '', //Message ID
rid: '', //Recipient ID
sid: '' //Segment ID
};
//s.channelManager('excmpid,ep_mid,s_kwcid,ef_id', '', 'cmgvo', '', 's_tbm', 60);
//derive this page channel/campaign
s.channelManager('excmpid,sfmc_cid,ep_mid,s_kwcid,ef_id', '', '0', '', 's_tbm', 60);
switch (s._channel) {
case 'Typed/Bookmarked':
s._channel = 'Direct';
break;
case 'Unknown Paid Channel':
s._channel = 'All Other Campaigns';
break;
case 'Natural Search':
s._channel = 'Organic Search';
break;
case 'Other Natural Referrers':
s._channel = 'Other Sites';
break;
default:
break;
}
/*_satellite.notify('KIWI: Channel settings: _channel: '+ s._channel +'; _campaignID: '+ s._campaignID +
'; _campaign: '+ s._campaign +'; _referrer: '+ s._referrer +
'; _referringDomain: '+ s._referringDomain +'; _partner: '+ s._partner +
'; _keywords: '+ s._keywords);*/
//set values for this page
if (s._channel) kiwi._thisPage.mktg.channel = s._channel;
if (s._campaignID && s._campaignID != 'n/a') kiwi._thisPage.mktg.campaign = s._campaignID.toLowerCase();
/* SFMC Campaigns */
/* SFMC Links pattern (email): ?SFMC_cid=EM%%JobId%%-%%=StringToHex(__AdditionalEmailAttribute1)=%%&rid=%%SubscriberID%% */
/* SFMC Links pattern (text): ?SFMC_cid=TX%%JobId%%-%%=StringToHex(__AdditionalEmailAttribute1)=%%&rid=%%SubscriberID%% */
kiwi._thisPage.mktg.mid = _satellite.getVar('QP sfmc_cid');
kiwi._thisPage.mktg.rid = _satellite.getVar('QP rid');
if (kiwi._thisPage.mktg.mid.match(/-/)) {
//parse out segment val
var tmp = kiwi._thisPage.mktg.mid.split('-');
kiwi._thisPage.mktg.mid = tmp[0];
kiwi._thisPage.mktg.sid = decodeURIComponent(kiwi.util.hex2a(tmp[1]));
}
/* Epsilon DREAM Campaigns */
if (!kiwi._thisPage.mktg.mid) {
kiwi._thisPage.mktg.mid = _satellite.getVar('QP ep_mid');
kiwi._thisPage.mktg.rid = _satellite.getVar('QP ep_rid');
kiwi._thisPage.mktg.sid = _satellite.getVar('QP etId');
}
//set values for life cookie
if (kiwi._thisPage.mktg.channel) {
kiwi._lifeCookieMod = true;
//check if within 60 days
var todayDate = new Date(),
setDate = new Date(kiwi.cookie.life.mktg.dateSet),
expDate = setDate.setDate(setDate.getDate() + 60);
if (expDate < todayDate) {
//start over
//kiwi.cookie.life.mktg.channels = kiwi._thisPage.mktg.channel;
if (kiwi._thisPage.mktg.campaign) kiwi.cookie.life.mktg.campaigns = kiwi._thisPage.mktg.campaign;
} else {
//add them to the list && pop off first in list if urlencoded new ones are longer than 100 chars
//kiwi.cookie.life.mktg.channels = (kiwi.cookie.life.mktg.channels == '')?kiwi._thisPage.mktg.channel:kiwi.util.appendToList(kiwi.cookie.life.mktg.channels, kiwi._thisPage.mktg.channel, ',', 3);
//kiwi.cookie.life.mktg.channels = kiwi.util.chopToLength( kiwi.cookie.life.mktg.channels, 100, true );
if (kiwi._thisPage.mktg.campaign) {
kiwi.cookie.life.mktg.campaigns = (kiwi.cookie.life.mktg.campaigns == '')?kiwi._thisPage.mktg.campaign:kiwi.util.appendToList(kiwi.cookie.life.mktg.campaigns, kiwi._thisPage.mktg.campaign, '>', 3);
kiwi.cookie.life.mktg.campaigns = kiwi.util.chopToLength( kiwi.cookie.life.mktg.campaigns, 100, true );
if (kiwi.cookie.life.mktg.latest) {
kiwi.cookie.life.mktg.latest.channel = kiwi._thisPage.mktg.channel;
kiwi.cookie.life.mktg.latest.campaign = kiwi._thisPage.mktg.campaign;
}
}
}
if (kiwi._thisPage.mktg.mid) {
var tmp = kiwi._thisPage.mktg.mid+kiwi._thisPage.mktg.rid,
regexp = new RegExp('(^|,)'+tmp+'(,|$)', 'i');
if (!kiwi.cookie.life.mktg.midrids.match(regexp)) s.events = s.apl(s.events, 'event40', ',', 2); //Email Unique Clicked
kiwi.cookie.life.mktg.midrids = kiwi.util.appendToList(kiwi.cookie.life.mktg.midrids, tmp, ',', 3);
}
}
//pass data to analytics
//campaigns
s.prop17 = kiwi.cookie.life.mktg.campaigns; //Marketing Campaign Participation
if (kiwi._thisPage.mktg.campaign) {
s.campaign = s.getValOnce(kiwi._thisPage.mktg.campaign, 's_v0', 30); //Marketing Campaign Last
s.events = s.apl(s.events, 'event30', ',', 2); //Non-Deduped Campaign Clicks
s.prop59 = kiwi._thisPage.mktg.campaign; //Non-Deduped Campaign
}
//other
s.eVar39 = kiwi._thisPage.mktg.sid; //Email Segment ID
s.eVar42 = kiwi._thisPage.mktg.rid; //Email Recipient ID
/* end Marketing Channels/Campaigns */
/* Referral Promo ID */
s.eVar12 = _satellite.getVar('QP refid');
/* Patches/Hacks */
/*//prevent myap double-page tracking after login, due to way IAM login + SPA application works
if (s.prop32 === 'myap' && s.pageName === s.prop52 && !s.r && !s.linkName) {
s.abort = true;
_satellite.notify('KIWI: Tool > Analytics > Custom JS > DO PLUGINS SECTION > Duplicate APFYM Call aborted.');
}*/
//Hacks required after AppMeas upgrade due to APOSR legacy S object tracking and modal popup behavior
if (s.pageName === 'apscore:contactus-thanks' && s.prop52 == 'apscore:contactus-thanks')
s.abort = true;
if (s.pageName === 'apscore:sendscores-disclaimer' && s.prop52 == 'apscore:sendscores-disclaimer')
s.pageName = 'apscore:sendscores-selectcolleges';
// Purchase, set by NSAT, patch 6/13/2011
if (s.pageName.toLowerCase().indexOf('step4:orderconfirmation') != -1)
s.events = s.apl(s.events, 'purchase', ',', 2);
/* end Patches/Hacks */
/* Sync duplicate vars */
if (s.pageName && !s.eVar4) s.eVar4 = 'D=pageName'; //PageName
if (s.prop18) s.eVar78 = 'D=c18'; //Hour of Day, Day of Week, Weekend/Weekday
/* end Sync duplicate vars */
//bake in cookied vals
s.prop7 = s.getPreviousValue(s.prop32, 'gpv_c32'); //Previous Site Code
s.prop52 = s.getPreviousValue(s.pageName, 'gpv_pn'); //Previous Page
/* Update Kiwi Cookies */
if (kiwi._lifeCookieMod) {
var cookieDays = 60,
newExpireOn = new Date().getTime() + (86400000*cookieDays),
expDate = new Date(newExpireOn);
document.cookie = 'kiwi_life=' + JSON.stringify(kiwi.cookie.life) + ';expires=' + expDate.toGMTString() +
';path=/ ;domain=collegeboard.org';
}
if (kiwi._sessCookieMod) {
document.cookie = 'kiwi_sess=' + JSON.stringify(kiwi.cookie.sess) +
';path=/ ;domain=collegeboard.org';
}
/* end Update Kiwi Cookies */
//reset stuff
if (cbTrackData.promosViewed) cbTrackData.promosViewed = '';
if (cbTrackData.promoClicked) cbTrackData.promoClicked = '';
if (cbTrackData.apRegistration) cbTrackData.apRegistration = '';
if (cbTrackData.apCourseEnrollment) cbTrackData.apCourseEnrollment = '';
if (cbTrackData.apExamRegistration) cbTrackData.apExamRegistration = '';
if (cbTrackData.flowCode) cbTrackData.flowCode = '';
if (cbTrackData.flowSteps) cbTrackData.flowSteps = '';
//protect against bad SPA repeat calls
kiwi._thisPage = kiwi._thisPage || {};
kiwi._thisPage.siteSettings = kiwi._thisPage.siteSettings || {};
kiwi.appPageTrackCalls = kiwi.appPageTrackCalls || {};
/*if (typeof kiwi._thisPage.siteSettings.appType !== 'undefined' && kiwi._thisPage.siteSettings.appType === 'spa-noroutes') {// this is handled on pushstate for apps that use meaningful urls
ruleName = 'KIWI: Tool > Analytics > Custom JS > DO PLUGINS SECTION';
if (typeof kiwi.appPageTrackCalls !== 'undefined' &&
typeof kiwi.appPageTrackCalls.totalSinceLastTrack !== 'undefined' &&
typeof kiwi.appPageTrackCalls.currentIncrement !== 'undefined' &&
kiwi.appPageTrackCalls.totalSinceLastTrack !== kiwi.appPageTrackCalls.currentIncrement) {
s.abort = true;
_satellite.notify(ruleName + ' > appPageTrackCalls.currentIncrement: ' + kiwi.appPageTrackCalls.currentIncrement + ' aborted.');
} else {
_satellite.notify(ruleName + ' > appPageTrackCalls.currentIncrement: ' + kiwi.appPageTrackCalls.currentIncrement + ' allowed.');
kiwi.appPageTrackCalls = {totalSinceLastTrack: 0, currentIncrement: 0};
}
}*/
//_satellite.notify('KIWI: Tool > Analytics > Custom JS > DO PLUGINS SECTION (end)');
};
/** end Do Plugins Section **/
/************************** PLUGINS SECTION *************************/
//expire legacy cookies
if (document.cookie.match(/dtm_cbAcctData=/)) document.cookie = 'dtm_cbAcctData=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/ ;domain=collegeboard.org';
if (document.cookie.match(/kiwi_cookie=/)) document.cookie = 'kiwi_cookie=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/ ;domain=collegeboard.org';
//if (document.cookie.match(/cbtrack_nav=/)) document.cookie = 'cbtrack_nav=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/ ;domain=collegeboard.org';
// Kiwi Cookies
kiwi._lifeCookieMod = kiwi._sessCookieMod = false;
kiwi.cookie = {
life: {
mktg: {
dateSet: new Date(),
channels: '',
campaigns: '',
midrids: ''
}
},
sess: {
user: {},
prev: {
siteCode: '',
pageName: '',
channel: '',
campaign: ''
},
mboxEvents: {
track_sat_sv: false,
track_psat_sv: false
},
features: {}
}
};
//get cookie data
kiwi._cookielife = _satellite.getVar('Cookie - Kiwi Lifetime');
if (kiwi._cookielife) {
kiwi.cookie.life = JSON.parse(kiwi._cookielife);
}
kiwi._cookiesess = _satellite.getVar('Cookie - Kiwi Session');
if (kiwi._cookiesess) {
kiwi.cookie.sess = JSON.parse(kiwi._cookiesess);
}
// general config
kiwi.config = {
subdomainsRegex: {
legacyWAP: /^(account|scores)$/i
}
};
//Initialize kiwi._thisPage values
kiwi._thisPage = kiwi.util.getThisPageSettings();
/*
// Utilities
Syntax: s.Util.getQueryParam(key, [url], [delim])
Parameters:
key (required) The name of the query string parameter that you want to get. This parameter is case sensitive.
url (optional) Default url is s.pageURL or window.location. Specifying a value for this parameter overrides the URL from which the query parameter is retrieved to the one specified.
delim (optional) Parameter delimiter in the URL. Default delimiter is "&". This lets you to specify an alternate query-string delimiter, such as ";".
*/
/* Legacy H27.4 Utility Hacks by jbeach 6/29/2016 */
s.wd = s.w || window;
s.epa = function (e) {
var t, n, o = this;
return e ? (e = o.rep('' + e, '+', ' '),
3 == o.em ? (n = new Function('x', 'var y,e;try{y=decodeURIComponent(x)}catch(e){y=unescape(x)}return y'),
n(e)) : unescape(e)) : t;
};
s.rep = function (e, t, n) {
var o, i = new Array, r = 0;
if (e)
if (e.split)
i = e.split(t);
else if (t)
for (; r >= 0;)
o = e.indexOf(t, r),
i[i.length] = e.substring(r, 0 > o ? e.length : o),
r = o,
r >= 0 && (r += t.length);
else
for (r = 0; r < e.length; r++)
i[i.length] = e.substring(r, r + 1);
if (e = '',
o = i.length,
i && o > 0 && (e = i[0],
o > 1))
if (i.join)
e = i.join(n);
else
for (r = 1; o > r; r++)
e += n + i[r];
return e;
};
s.fl=function(x,l){return x?(''+x).substring(0,l):x;};
/* end Legacy H27.4 Utility Hacks by jbeach 6/29/2016 */
/* eslint-disable */
// Utility Plugins
/*
* Plugin Utility Function: join
*/
s.join = new Function("v","p",""
+"var s = this;var f,b,d,w;if(p){f=p.front?p.front:'';b=p.back?p.back"
+":'';d=p.delim?p.delim:'';w=p.wrap?p.wrap:'';}var str='';for(var x=0"
+";x<v.length;x++){if(typeof(v[x])=='object' )str+=s.join( v[x],p);el"
+"se str+=w+v[x]+w;if(x<v.length-1)str+=d;}return f+str+b;");
/*
* Plugin Utility Function: split v1.5 - split a string (JS 1.0 compatible)
*/
s.split=new Function("l","d",""
+"var i,x=0,a=new Array;while(l){i=l.indexOf(d);i=i>-1?i:l.length;a[x"
+"++]=l.substring(0,i);l=l.substring(i+d.length);}return a");
/*
* Plugin Utility: apl v1.1
*/
s.apl=new Function("l","v","d","u",""
+"var s=this,m=0;if(!l)l='';if(u){var i,n,a=s.split(l,d);for(i=0;i<a."
+"length;i++){n=a[i];m=m||(u==1?(n==v):(n.toLowerCase()==v.toLowerCas"
+"e()));}}if(!m)l=l?l+d+v:v;return l");
/*
* Utility Function: p_gn
*/
s.p_gn=new Function("t","h",""
+"var i=t?t.indexOf('~'):-1,n,x;if(t&&h){n=i<0?'':t.substring(0,i);x="
+"t.substring(i+1);if(h.indexOf(x.toLowerCase())>-1)return n?n:'[[';}"
+"return 0;");
/*
* Utility Function: p_c
*/
s.p_c=new Function("v","c",""
+"var x=v.indexOf('=');return c.toLowerCase()==v.substring(0,x<0?v.le"
+"ngth:x).toLowerCase()?v:0");
/*
* Utility Function: p_gh
*/
s.p_gh=new Function(""
+"var s=this;if(!s.eo&&!s.lnk)return '';var o=s.eo?s.eo:s.lnk,y=s.ot("
+"o),n=s.oid(o),x=o.s_oidt;if(s.eo&&o==s.eo){while(o&&!n&&y!='BODY'){"
+"o=o.parentElement?o.parentElement:o.parentNode;if(!o)return '';y=s."
+"ot(o);n=s.oid(o);x=o.s_oidt}}return o.href?o.href:'';");
/*
* Utility Function: p_fo
*/
s.p_fo=new Function("n",""
+"var s=this;if(!s.__fo){s.__fo=new Object;}if(!s.__fo[n]){s.__fo[n]="
+"new Object;return 1;}else {return 0;}");
/*
* pt - utility function
*/
s.pt=function(x,d,f,a){var s=this,t=x,z=0,y,r;while(t){y=t.indexOf(d);y=y<0?t.length:y;t=t.substring(0,y);r=s[f](t,a);if(r)return r;z+=y+d.length;t=x.substring(z,x.length);t=z<x.length?t:""}return""};
/*
* Plugin Utility: Replace v1.0
*/
s.repl=new Function("x","o","n",""
+"var i=x.indexOf(o),l=n.length;while(x&&i>=0){x=x.substring(0,i)+n+x."
+"substring(i+o.length);i=x.indexOf(o,i+l)}return x");
/*
* Plugin: searchValue : 1.0 - searches string and returns value
*/
s.searchValue=new Function("p","d","u","vu",""
+"var s=this,i,t,k,dl,mv,mm,rv,x;while(p){i=p.indexOf(',');i=i<0?p.le"
+"ngth:i;k=p.substring(0,i);dl=k.indexOf(d);mv=k.substring(0,dl);mm=k"
+".substring(dl+1);u=u+'';rv=vu?vu:mv;if(mm=='e'){x=u.indexOf(mv);if("
+"x>-1) return rv;}else{x=u.substring(mm,mv.length);if(mv==x) return "
+"rv;}p=p.substring(i==p.length?i:i+1)}return ''");
/*
* Plugin: getVisitStart v2.0 - returns 1 on 1st page of visit, else 0
*/
s.getVisitStart=new Function("c",""
+"var s=this,v=1,t=new Date;t.setTime(t.getTime()+1800000);if(s.c_r(c"
+")){v=0}if(!s.c_w(c,1,t)){s.c_w(c,1,0)}if(!s.c_r(c)){v=0}return v;");
/*
* getQueryParam v2.5 - H-code and AppMeasurement Compatible
*/
s.getQueryParam=function(p,d,u,h){var s=this,v="",i,j,t;d=d?d:"";u=u?u:s.pageURL?s.pageURL:s.wd?s.wd.location:window.location;while(p){i=p.indexOf(",");i=i<0?p.length:i;t=s.p_gpv(p.substring(0,i),u+"",h);if(t)t=t.indexOf("#")>-1?t.substring(0,t.indexOf("#")):t;if(t)v+=v?d+t:t;p=p.substring(i==p.length?i:i+1)}return v};
s.p_gpv=function(k,u,h){var s=this,v="",q;j=h==1?"#":"?";i=u.indexOf(j);if(k&&i>-1){q=u.substring(i+1);v=s.pt(q,"&","p_gvf",k)}return v};
s.p_gvf=function(t,k){if(t){var s=this,i=t.indexOf("="),p=i<0?t:t.substring(0,i),v=i<0?true:t.substring(i+1);if(p.toLowerCase()==k.toLowerCase())return s.epa?s.epa(v):s.unescape(v)}return""};
/*
* Plugin: getPreviousValue_v1.0 - return previous value of designated
* variable (requires split utility)
*/
s.getPreviousValue=new Function("v","c","el",""
+"var s=this,t=new Date,i,j,r='';t.setTime(t.getTime()+1800000);if(el"
+"){if(s.events){i=s.split(el,',');j=s.split(s.events,',');for(x in i"
+"){for(y in j){if(i[x]==j[y]){if(s.c_r(c)) r=s.c_r(c);v?s.c_w(c,v,t)"
+":s.c_w(c,'no value',t);return r}}}}}else{if(s.c_r(c)) r=s.c_r(c);v?"
+"s.c_w(c,v,t):s.c_w(c,'no value',t);return r}");
// Plugins
/*
* Plugin: getTimeParting 3.4
*/
s.getTimeParting=new Function("h","z",""
+"var s=this,od;od=new Date('1/1/2000');if(od.getDay()!=6||od.getMont"
+"h()!=0){return'Data Not Available';}else{var H,M,D,U,ds,de,tm,da=['"
+"Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturda"
+"y'],d=new Date();z=z?z:0;z=parseFloat(z);if(s._tpDST){var dso=s._tp"
+"DST[d.getFullYear()].split(/,/);ds=new Date(dso[0]+'/'+d.getFullYea"
+"r());de=new Date(dso[1]+'/'+d.getFullYear());if(h=='n'&&d>ds&&d<de)"
+"{z=z+1;}else if(h=='s'&&(d>de||d<ds)){z=z+1;}}d=d.getTime()+(d.getT"
+"imezoneOffset()*60000);d=new Date(d+(3600000*z));H=d.getHours();M=d"
+".getMinutes();M=(M<10)?'0'+M:M;D=d.getDay();U=' AM';if(H>=12){U=' P"
+"M';H=H-12;}if(H==0){H=12;}D=da[D];tm=H+':'+M+U;return(tm+'|'+D);}");
/*
* Plugin: Days since last Visit 1.1 - capture time from last visit
*/
s.getDaysSinceLastVisit=new Function("c",""
+"var s=this,e=new Date(),es=new Date(),cval,cval_s,cval_ss,ct=e.getT"
+"ime(),day=24*60*60*1000,f1,f2,f3,f4,f5;e.setTime(ct+3*365*day);es.s"
+"etTime(ct+30*60*1000);f0='Cookies Not Supported';f1='First Visit';f"
+"2='More than 30 days';f3='More than 7 days';f4='Less than 7 days';f"
+"5='Less than 1 day';cval=s.c_r(c);if(cval.length==0){s.c_w(c,ct,e);"
+"s.c_w(c+'_s',f1,es);}else{var d=ct-cval;if(d>30*60*1000){if(d>30*da"
+"y){s.c_w(c,ct,e);s.c_w(c+'_s',f2,es);}else if(d<30*day+1 && d>7*day"
+"){s.c_w(c,ct,e);s.c_w(c+'_s',f3,es);}else if(d<7*day+1 && d>day){s."
+"c_w(c,ct,e);s.c_w(c+'_s',f4,es);}else if(d<day+1){s.c_w(c,ct,e);s.c"
+"_w(c+'_s',f5,es);}}else{s.c_w(c,ct,e);cval_ss=s.c_r(c+'_s');s.c_w(c"
+"+'_s',cval_ss,es);}}cval_s=s.c_r(c+'_s');if(cval_s.length==0) retur"
+"n f0;else if(cval_s!=f1&&cval_s!=f2&&cval_s!=f3&&cval_s!=f4&&cval_s"
+"!=f5) return '';else return cval_s;");
/*
* Plugin: getNewRepeat 1.2 - Returns whether user is new or repeat
*/
s.getNewRepeat=new Function("d","cn",""
+"var s=this,e=new Date(),cval,sval,ct=e.getTime();d=d?d:30;cn=cn?cn:"
+"'s_nr';e.setTime(ct+d*24*60*60*1000);cval=s.c_r(cn);if(cval.length="
+"=0){s.c_w(cn,ct+'-New',e);return'New';}sval=s.split(cval,'-');if(ct"
+"-sval[0]<30*60*1000&&sval[1]=='New'){s.c_w(cn,ct+'-New',e);return'N"
+"ew';}else{s.c_w(cn,ct+'-Repeat',e);return'Repeat';}");
/*
* Plugin: getActionDepth v1.0
*/
s.getActionDepth=new Function("c",""
+ "var s=this,v=1,t=new Date;t.setTime(t.getTime()+1800000);"
+ "if(!s.c_r(c)){v=1}if(s.c_r(c)){v=s.c_r(c);v++}"
+ "if(!s.c_w(c,v,t)){s.c_w(c,v,0)}return v;");
/*
* Plugin: getValOnce_v1.11
*/
s.getValOnce=new Function("v","c","e","t",""
+"var s=this,a=new Date,v=v?v:'',c=c?c:'s_gvo',e=e?e:0,i=t=='m'?6000"
+"0:86400000,k=s.c_r(c);if(v){a.setTime(a.getTime()+e*i);s.c_w(c,v,e"
+"==0?0:a);}return v==k?'':v");
/*
* Plugin: getPercentPageViewed v1.71
*/
s.getPercentPageViewed=new Function("n",""
+"var s=this,W=window,EL=W.addEventListener,AE=W.attachEvent,E=['load"
+"','unload','scroll','resize','zoom','keyup','mouseup','touchend','o"
+"rientationchange','pan'];W.s_Obj=s;s_PPVid=(n=='-'?s.pageName:n)||s"
+".pageName||location.href;if(!W.s_PPVevent){s.s_PPVg=function(n,r){v"
+"ar k='s_ppv',p=k+'l',c=s.c_r(n||r?k:p),a=c.indexOf(',')>-1?c.split("
+"',',10):[''],l=a.length,i;a[0]=unescape(a[0]);r=r||(n&&n!=a[0])||0;"
+"a.length=10;if(typeof a[0]!='string')a[0]='';for(i=1;i<10;i++)a[i]="
+"!r&&i<l?parseInt(a[i])||0:0;if(l<10||typeof a[9]!='string')a[9]='';"
+"if(r){s.c_w(p,c);s.c_w(k,'?')}return a};W.s_PPVevent=function(e){va"
+"r W=window,D=document,B=D.body,E=D.documentElement,S=window.screen|"
+"|0,Ho='offsetHeight',Hs='scrollHeight',Ts='scrollTop',Wc='clientWid"
+"th',Hc='clientHeight',C=100,M=Math,J='object',N='number',s=W.s_Obj|"
+"|W.s||0;e=e&&typeof e==J?e.type||'':'';if(!e.indexOf('on'))e=e.subs"
+"tring(2);s_PPVi=W.s_PPVi||0;if(W.s_PPVt&&!e){clearTimeout(s_PPVt);s"
+"_PPVt=0;if(s_PPVi<2)s_PPVi++}if(typeof s==J){var h=M.max(B[Hs]||E[H"
+"s],B[Ho]||E[Ho],B[Hc]||E[Hc]),X=W.innerWidth||E[Wc]||B[Wc]||0,Y=W.i"
+"nnerHeight||E[Hc]||B[Hc]||0,x=S?S.width:0,y=S?S.height:0,r=M.round("
+"C*(W.devicePixelRatio||1))/C,b=(D.pageYOffset||E[Ts]||B[Ts]||0)+Y,p"
+"=h>0&&b>0?M.round(C*b/h):0,O=W.orientation,o=!isNaN(O)?M.abs(o)%180"
+":Y>X?0:90,L=e=='load'||s_PPVi<1,a=s.s_PPVg(s_PPVid,L),V=function(i,"
+"v,f,n){i=parseInt(typeof a==J&&a.length>i?a[i]:'0')||0;v=typeof v!="
+"N?i:v;v=f||v>i?v:i;return n?v:v>C?C:v<0?0:v};if(new RegExp('(iPod|i"
+"Pad|iPhone)').exec(navigator.userAgent||'')&&o){o=x;x=y;y=o}o=o?'P'"
+":'L';a[9]=L?'':a[9].substring(0,1);s.c_w('s_ppv',escape(W.s_PPVid)+"
+"','+V(1,p,L)+','+(L||!V(2)?p:V(2))+','+V(3,b,L,1)+','+X+','+Y+','+x"
+"+','+y+','+r+','+a[9]+(a[9]==o?'':o))}if(!W.s_PPVt&&e!='unload')W.s"
+"_PPVt=setTimeout(W.s_PPVevent,333)};for(var f=W.s_PPVevent,i=0;i<E."
+"length;i++)if(EL)EL(E[i],f,false);else if(AE)AE('on'+E[i],f);f()};v"
+"ar a=s.s_PPVg();return!n||n=='-'?a[1]:a");
/*
* Plugin: Performance Timing Tracking - 0.1 BETA
*/
s.performanceTiming=new Function("v",""
+"var s=this;if(v)s.ptv=v;if(typeof performance!='undefined'){if(perf"
+"ormance.timing.loadEventEnd==0){s.pi=setInterval(function(){s.perfo"
+"rmanceWrite()},250);}if(!s.ptc||s.linkType=='e'){s.performanceRead("
+");}else{s.rfe();s[s.ptv]='';}}");
s.performanceWrite=new Function("",""
+"var s=this;if(performance.timing.loadEventEnd>0)clearInterval(s.pi)"
+";try{if(s.c_r('s_ptc')==''&&performance.timing.loadEventEnd>0){try{"
+"var pt=performance.timing;var pta='';pta=s.performanceCheck(pt.fetc"
+"hStart,pt.navigationStart);pta+='^^'+s.performanceCheck(pt.domainLo"
+"okupStart,pt.fetchStart);pta+='^^'+s.performanceCheck(pt.domainLook"
+"upEnd,pt.domainLookupStart);pta+='^^'+s.performanceCheck(pt.connect"
+"End,pt.connectStart);pta+='^^'+s.performanceCheck(pt.responseStart,"
+"pt.connectEnd);pta+='^^'+s.performanceCheck(pt.responseEnd,pt.respo"
+"nseStart);pta+='^^'+s.performanceCheck(pt.loadEventStart,pt.domLoad"
+"ing);pta+='^^'+s.performanceCheck(pt.loadEventEnd,pt.loadEventStart"
+");pta+='^^'+s.performanceCheck(pt.loadEventEnd,pt.navigationStart);"
+"s.c_w('s_ptc',pta);if(sessionStorage&&navigator.cookieEnabled&&s.pt"
+"v!='undefined'){var pe=performance.getEntries();var tempPe='';for(v"
+"ar i=0;i<pe.length;i++){tempPe+='!';tempPe+=pe[i].name.indexOf('?')"
+">-1?pe[i].name.split('?')[0]:pe[i].name;tempPe+='|'+(Math.round(pe["
+"i].startTime)/1000).toFixed(1)+'|'+(Math.round(pe[i].duration)/1000"
+").toFixed(1)+'|'+pe[i].initiatorType;}sessionStorage.setItem('s_pec"
+"',tempPe);}}catch(err){return;}}}catch(err){return;}");
s.performanceCheck=new Function("a","b",""
+"if(a>=0&&b>=0){if((a-b)<60000&&((a-b)>=0)){return((a-b)/1000).toFix"
+"ed(2);}else{return 600;}}");
s.performanceRead=new Function("",""
+"var s=this;if(performance.timing.loadEventEnd>0)clearInterval(s.pi)"
+";var cv=s.c_r('s_ptc');if(s.pte){var ela=s.pte.split(',');}if(cv!='"
+"'){var cva=s.split(cv,'^^');if(cva[1]!=''){for(var x=0;x<(ela.lengt"
+"h-1);x++){s.events=s.apl(s.events,ela[x]+'='+cva[x],',',2);}}s.even"
+"ts=s.apl(s.events,ela[ela.length-1],',',2);}s.linkTrackEvents=s.apl"
+"(s.linkTrackEvents,s.pte,',',2);s.c_w('s_ptc','',0);if(sessionStora"
+"ge&&navigator.cookieEnabled&&s.ptv!='undefined'){s[s.ptv]=sessionSt"
+"orage.getItem('s_pec');sessionStorage.setItem('s_pec','',0);}else{s"
+"[s.ptv]='sessionStorage Unavailable';}s.ptc=true;");
s.rfe=new Function("",""
+"var s=this;var ea=s.split(s.events,',');var pta=s.split(s.pte,',');"
+"try{for(x in pta){var ptr=new RegExp(pta[x]+'[^\,][0-9]*\.[0-9](.*)"
+"');s.events=s.events.match(ptr)[1];s.contextData['events']=s.events"
+";}}catch(e){return;}");
/* Plugin: channelManager v3.06 */
/* channelManager seList (Top 40 Search Engines) */
s.seList="google.,googlesyndication.com,.googleadservices.com|q,as_q|Google>bing.com|q|Bing>yahoo.com,yahoo.co.jp|p,va|Yahoo!>ask.jp,ask.co|q,ask|Ask>search.aol.,suche.aolsvc.de|q,query|AOL>altavista.co,altavista.de|q,r|AltaVista>.mywebsearch.com|searchfor|MyWebSearch>webcrawler.com|q|WebCrawler>wow.com|q|Wow>infospace.com|q|InfoSpace>blekko.com|q|Blekko>dogpile.com|q|DogPile>alhea.com|q|Alhea>duckduckgo.com|q|DuckDuckGo>info.com|qkw|Info.com>contenko.com|q|Contenko>baidu.com|word,wd|Baidu>daum.net,search.daum.net|q|Daum>icqit.com|q|icq>myway.com|searchfor|MyWay.com>naver.com,search.naver.com|query|Naver>netscape.com|query,search|Netscape Search>reference.com|q|Reference.com>seznam|w|Seznam.cz>abcsok.no|q|Startsiden>tiscali.it,www.tiscali.co.uk|key,query|Tiscali>virgilio.it|qs|Virgilio>yandex|text|Yandex.ru>optimum.net|q|Optimum Search>search.earthlink.net|q|Earthlink>search.comcast.net|q|Comcast>libero.it|query|libero.it>excite.co|search|Excite>mail.ru|q|Mail.ru>isearch.avg.com|q|AVG>msn.com|q|MSN>seznam.cz|q|seznam.cz>so.com|q|so.com>ixquick.com|query|ixquick.com>sogou.com|query|sogou.com>360.cn|q|360.cn";
s._channelDomain="Partner Sites|khanacademy.org,roadtripnation.com,epiconline.org,accuplacer.org";
s._channelParameter="Email|ep_mid";
s._channelPattern="Email|em>Triggered|tr>External Email|ex>SMS|tx>Offline Marketing|mtg,cb,dm>Online Media|oc>Social Media|sm,fb>Outbound Callers|ob>Push Notifications|ph>Affiliates|af>Vanity URLs|vt>Partner Sites|pt";
s.channelManager=function(a,b,c,d,e,f,g){var s=this,h=new Date,i=0,j,k,l,m,n,o,p,q,r,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V;U=s.getQueryParam?1:0;V=s.repl?1:0;if(e){i=1;if(s.c_r(e))i=0;h.setTime(h.getTime()+18E5);s.c_w(e,1,h);if(f&&s.c_r("s_tbm"+e+f.toString()))i=0}j=s.referrer?s.referrer:document.referrer;if(j=="Typed/Bookmarked")j="";j=decodeURIComponent(j.toLowerCase());if(!j)k=1;else{l=j.indexOf("?")>-1?j.indexOf("?"):j.length;m=j.substring(0,l);n=j.split("/");n=n[2].split("?");
o=n[0].toLowerCase();p=s.linkInternalFilters.toLowerCase();p=p.split(",");for(q=0;q<p.length;q++){r=o.indexOf(p[q])==-1?"":j;if(r)break}}if(!r&&!k){t=j;u=o;w="Other Natural Referrers";v=w+": "+o;x=s.seList+">"+s._extraSearchEngines;if(d==1){m=V?s.repl(m,"oogle","%"):s.replace(m,"oogle","%");m=V?s.repl(m,"ahoo","^"):s.replace(m,"ahoo","^");j=V?s.repl(j,"as_q","*"):s.replace(j,"as_q","*")}y=x.split(">");for(z=0;z<y.length;z++){A=y[z];A=A.split("|");B=A[0].split(",");for(C=0;C<B.length;C++){D=m.indexOf(B[C]);
if(D>-1){if(A[2])E=v=A[2];else E=o;if(d==1){E=V?s.repl(E,"#"," - "):s.replace(E,"#"," - ");j=V?s.repl(j,"*","as_q"):s.replace(j,"*","as_q");E=V?s.repl(E,"^","ahoo"):s.replace(E,"^","ahoo");E=V?s.repl(E,"%","oogle"):s.replace(E,"%","oogle")}F=A[1].split(",");for(G=0;G<F.length;G++){if(j.indexOf(F[G]+"=")>-1||j.indexOf("duckduckgo")>-1||j.indexOf("googlequicksearchbox")>-1||j.indexOf("http://www.google.")==0||j.indexOf("https://www.google.")==0||j.indexOf("https://search.yahoo.com/")==0||j.indexOf("http://r.search.yahoo.com")==
0||j.indexOf("https://www.bing.com")==0)H=1;I=U?s.getQueryParam(F[G],"",j).toLowerCase():s.Util.getQueryParam(F[G],j).toLowerCase();if(H||I)break}}if(H||I)break}if(H||I)break}}if(!r||g!="1"){J=a.split(",");for(var q in J)if(J.hasOwnProperty(q))if(U?s.getQueryParam(J[q]):s.Util.getQueryParam(J[q]))if(b)T=T?T+b+(U?s.getQueryParam(J[q]):s.Util.getQueryParam(J[q])):U?s.getQueryParam(J[q]):s.Util.getQueryParam(J[q]);else{T=U?s.getQueryParam(J[q]):s.Util.getQueryParam(J[q]);if(T)break}if(T){v=T;if(E)w=
"Paid Search";else w="Unknown Paid Channel"}if(!T&&E&&H){w="Natural Search";v=w+": "+E}}if(i&&k&&!T)t=u=v=w="Typed/Bookmarked";J=s._channelDomain;if(J&&o&&!r){K=J.split(">");for(L=0;L<K.length;L++){M=K[L]?K[L].split("|"):"";N=M[1]?M[1].split(","):"";O=N.length;for(P=0;P<O;P++){Q=N[P].toLowerCase();R=("/"+o).indexOf(Q);if(R>-1){w=M[0];v=T?v:w+": "+o;break}}if(R>-1)break}}J=s._channelParameter;if(J&&g!="1"){K=J.split(">");for(L=0;L<K.length;L++){M=K[L]?K[L].split("|"):"";N=M[1]?M[1].split(","):"";O=
N.length;for(P=0;P<O;P++){R=U?s.getQueryParam(N[P]):s.Util.getQueryParam(N[P]);if(R){w=M[0];v=T?v:w+": "+o;break}}if(R)break}}J=s._channelPattern;if(J&&g!="1"&&T){K=J.split(">");for(L=0;L<K.length;L++){M=K[L]?K[L].split("|"):"";N=M[1]?M[1].split(","):"";O=N.length;for(P=0;P<O;P++){Q=N[P].toLowerCase();R=T?T.toLowerCase():"";S=R.indexOf(Q);if(S==0){w=M[0];break}}if(S==0)break}}S=w?T+u+w+I:"";c=c?c:"c_m";if(c!="0")S=s.getValOnce(S,c,0);if(S){s._campaignID=T?T:"n/a";s._referrer=t?t:"n/a";s._referringDomain=
u?u:"n/a";s._campaign=v?v:"n/a";s._channel=w?w:"n/a";s._partner=E?E:"n/a";s._keywords=H?I?I:"Keyword Unavailable":"n/a";if(f&&w!="Typed/Bookmarked"){h.setTime(h.getTime()+f*864E5);s.c_w("s_tbm"+e+f.toString(),1,h)}}else s._campaignID=s._referrer=s._referringDomain=s._campaign=s._channel=s._partner=s._keywords=""};
/*
* Plugin: setupLinkTrack v3.02AM
*/
s.setupLinkTrack=new Function("vl","c","e",""
+"var cv=s.c_r(c);if(vl){var vla=vl.split(',');}if(cv!=''){var cva=s."
+"split(cv,'^^');if(cva[1]!=''){for(x in vla){s[vla[x]]=cva[x];if(e){"
+"s.events=s.apl(s.events,e,',',2);}}}}s.c_w(c,'',0);if(typeof s.link"
+"Object!='undefined'&&s.hbx_lt!='manual'){s.lta=[];if(typeof s.pageN"
+"ame!='undefined')s.lta[0]=s.pageName;if(typeof s.linkObject!=null){"
+"slo=s.linkObject;if(s.linkObject!=0){if(s.linkObject.getAttribute('"
+"name')!=null){var b=s.linkObject.getAttribute('name');if(b.indexOf("
+"'&lpos=')>-1){s.lta[3]=b.match('\&lpos\=([^\&]*)')[1];}if(b.indexOf"
+"('&lid=')>-1){s.lta[1]=b.match('\&lid\=([^\&]*)')[1];}}}if(typeof s"
+".lta[1]=='undefined'){if(s.linkName!=0){s.lta[1]=s.linkName;}else i"
+"f(s.linkObject!=0){if(s.linkObject.innerHTML.indexOf('<img')>-1){s."
+"lta[1]=s.linkObject.innerHTML.match('src=\"([^\"]*)')[1]}else{s.lta[1"
+"]=s.linkObject.innerHTML;}}}s.lta[2]=s.pageName+' | '+s.lta[1];}if("
+"s.linkType!=0){for(var x=0;x<vla.length;x++){s[vla[x]]=s.cleanStr(s"
+".lta[x]);if(e){s.events=s.apl(s.events,e,',',2);s.linkTrackVars=s.a"
+"pl(s.linkTrackVars,'events',',',2);}}s.linkTrackVars=s.apl(s.linkTr"
+"ackVars,vl,',',2);}else{if(s.lta[1]){var tcv='';for(var x=0;x<s.lta"
+".length;x++){tcv+=s.cleanStr(s.lta[x])+'^^'}s.c_w(c,tcv)}}s.lta=nul"
+"l;}");
s.cleanStr = function(a){
if(typeof a != 'undefined'){
a = a.replace(/<\/?span[^>]*>/g, '');
return a;
}
};
/* eslint-enable */
/************************** DELAY TRACKING SECTION ***************/
ruleName='KIWI: Tool > Analytics > Custom JS > DELAY TRACKING SECTION';
//suppress default page load track
kiwi._suppressTrack = true;
// send an event that aa page is ready to track
document.dispatchEvent(new CustomEvent('kiwi.ready.aa', {'bubbles': true}));
if(kiwi._suppressTrack) return false;
}
},
"e653cea501cb1b08dbc50ef2f1550ad79f81a499": {
"engine": "tnt",
"mboxURL": "7a8a98de0363fbed05b98da851d6b23866ffa7cc/mbox-contents-e653cea501cb1b08dbc50ef2f1550ad79f81a499.js",
"loadSync": true,
"pageParams": {
}
},
"8c94c038e1dbec941007f34bc69cd4bc3e4b08bc": {
"engine": "visitor_id",
"loadOn": "pagetop",
"name": "VisitorID",
"mcOrgId": "5E1B123F5245B29B0A490D45@AdobeOrg",
"autoRequest": true,
"initVars": {
},
"customerIDs": {
"crm_id": {
"id": "%Kiwi - CRM ID%",
"authState": "AUTHENTICATED"
}
}
}
},
"pageLoadRules": [
{"name":"00 Master - Page Bottom","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-57bf401064746d361f0064e4.js"}]}]}],"event":"pagebottom"},
{"name":"00 Master - Page Top","trigger":[{"command":"loadBlockingScript","arguments":[{"sequential":true,"scripts":[{"src":"satellite-5a81e11664746d5ff700072d.js"},{"src":"satellite-578e6f6764746d29b90028de.js"},{"src":"satellite-5d8a7a5864746d1e5c001919.js"},{"src":"satellite-5d70120c64746d7144003d1b.js"},{"src":"satellite-5d84ef3264746d48820000fe.js"},{"src":"satellite-5dc5a5ef64746d437e000137.js"}]}]}],"event":"pagetop"},
{"name":"APRO - DOM Ready","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5d8cf59664746d2d8e000439.js"}]}]}],"scope":{"URI":{"include":[/^\/($|\?)/i]},"subdomains":{"include":[/^apstudents\.collegeboard\.org$/i]}},"event":"domready"},
{"name":"Big Future - Page Top - Video Tracking","trigger":[{"command":"loadBlockingScript","arguments":[{"sequential":true,"scripts":[{"src":"satellite-58cae8d364746d0bb40060af.js"},{"src":"satellite-58caea1264746d2cd0007976.js"}]}]}],"scope":{"subdomains":{"include":["^bigfuture\\."]}},"event":"pagetop"},
{"name":"DOM Ready - bfm","trigger":[{"command":"loadScript","arguments":[{"sequential":true,"scripts":[{"src":"satellite-5d45a25764746d56f6000ec3.js"}]}]}],"scope":{"subdomains":{"include":[/^bigfuture\.collegeboard\.org$/i]}},"event":"domready"},
{"name":"MBOX nsat-orf-button-continue","trigger":[{"engine":"tnt","command":"addMbox","arguments":[{"mboxGoesAround":"#authenticatePage","mboxName":"nsat-orf-button-continue","arguments":[],"timeout":"1500"}]}],"scope":{"URI":{"include":["satweb/registration/viewAuthenticateStudentAction.action"]},"subdomains":{"include":["nsat.collegeboard.org"]}},"event":"pagebottom"},
{"name":"MBOX nsat-orf-pst-mainContainer","trigger":[{"engine":"tnt","command":"addMbox","arguments":[{"mboxGoesAround":".pst-mainContainer","mboxName":"nsat-orf-pst-mainContainer","arguments":[],"timeout":"1500"}]}],"scope":{"URI":{"include":["satweb/registration/viewAuthenticateStudentAction.action"]},"subdomains":{"include":["nsat.collegeboard.org"]}},"event":"pagetop"},
{"name":"MBOX nsat-orf-s2-horizontal-step","trigger":[{"engine":"tnt","command":"addMbox","arguments":[{"mboxGoesAround":".row.s2-horizontal-step","mboxName":"nsat-orf-s2-horizontal-step","arguments":[],"timeout":"1500"}]}],"scope":{"URI":{"include":["satweb/registration/viewAuthenticateStudentAction.action"]},"subdomains":{"include":["nsat.collegeboard.org"]}},"event":"pagebottom"},
{"name":"NSAT - MySAT - COVID-19 Alert","trigger":[{"command":"loadScript","arguments":[{"sequential":true,"scripts":[{"src":"satellite-5e6f910964746d2d2e00046d.js"}]}]}],"scope":{"URI":{"include":["satweb/satHomeAction.action"]},"subdomains":{"include":[/^nsat\.collegeboard\.org$/i]}},"event":"domready"},
{"name":"NSAT - MySAT - DOM Ready","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5ae75b3164746d59980008bb.js"}]}]}],"scope":{"URI":{"include":["satweb/satHomeAction.action"]},"subdomains":{"include":[/^nsat\.collegeboard\.org$/i]}},"event":"domready"},
{"name":"NSAT - ST Listening Avail (PLR)","trigger":[{"command":"loadScript","arguments":[{"sequential":true,"scripts":[{"src":"satellite-5ed6966a64746d47ca000d77.js"}]}]}],"scope":{"subdomains":{"include":[/^nsat\.collegeboard\.org$/i]}},"event":"domready"},
{"name":"NSAT - Test Center Avail","trigger":[{"command":"loadScript","arguments":[{"sequential":true,"scripts":[{"src":"satellite-5ed5798964746d511f0000f3.js"}]}]}],"scope":{"subdomains":{"include":[/^nsat\.collegeboard\.org$/i]}},"event":"domready"},
{"name":"Page Top - aps","trigger":[{"command":"loadBlockingScript","arguments":[{"sequential":true,"scripts":[{"src":"satellite-5a1dcffe64746d671f008065.js"}]}]}],"scope":{"subdomains":{"include":[/^apstudent.*\./i]}},"event":"pagebottom"},
{"name":"Page Top - bf","trigger":[{"command":"loadBlockingScript","arguments":[{"sequential":true,"scripts":[{"src":"satellite-58c01a0964746d0bba00152a.js"}]}]}],"scope":{"subdomains":{"include":[/^bigfuture\.collegeboard\.org$/i]}},"event":"pagetop"},
{"name":"Pages - Download - DOM Ready","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5c795b2c64746d226c002a8d.js"}]}]}],"scope":{"URI":{"include":[/^\/download(\/?|$)/i]},"subdomains":{"include":[/^pages\.collegeboard\.org$/i]},"domains":[/collegeboard\.org$/i]},"event":"domready"},
{"name":"Pixel - Alorica - Live Agent - APC","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5c75a3ca64746d6c4400069c.js"}]}]}],"scope":{"subdomains":{"include":[/^apcentral(-stg)?\.collegeboard\.org$/i]},"domains":[/collegeboard\.org$/i]},"conditions":[function(event,target){
/**
* Logic Provided by Dianna Choi in 2019-02
* https://jira.collegeboard.org/browse/WAP-2266
* Configured by jbeach on 2019-02-28
**/
//include all of apcentral
var bInclude = true,
bMatchFound = false;
//but exclude these paths...
if (document.location.pathname.match(/^\/(about-ap|content|courses|professional-development|score-reports-data\/awards|series|start-grow-ap\/international)/) !== null) {
bInclude = false;
//but include these again...
bInclude = bMatchFound = (document.location.pathname.match(/^\/courses$/) !== null);
if (!bMatchFound) bInclude = bMatchFound = (document.location.pathname.match(/^\/about-ap$/) !== null);
if (!bMatchFound) bInclude = bMatchFound = (document.location.pathname.match(/^\/courses\/exam-dates-and-fees/) !== null);
if (!bMatchFound) bInclude = bMatchFound = (document.location.pathname.match(/^\/courses\/.*\/(course|exam|portfolio|application-timeline)$/) !== null);
if (!bMatchFound) bInclude = bMatchFound = (document.location.pathname.match(/^\/series\/(ap-coordinator-tutorial|studio-art-submission-demo-ap-coordinators|studio-art-submission-demo-ap-teachers)/) !== null);
if (!bMatchFound && document.location.pathname.match(/^\/about-ap\//) !== null) {
bInclude = true;
bMatchFound = (
(document.location.pathname.match(/^\/about-ap\/how-ap-develops-courses-and-exams/) !== null) ||
(document.location.pathname.match(/^\/about-ap\/news-changes\/(ap-2019\/frequently-asked-questions|ap-2019\/support-students-new-online-tools|collaborations-with-ap)/) !== null) ||
(document.location.pathname.match(/^\/about-ap\/start-grow-ap\/(access-initiatives|ap-advocates-program|grow-ap\/spotlight-on-success|outreach-support-resources)/) !== null)
);
if(bMatchFound) bInclude = false;
bMatchFound = true;
}
if (!bMatchFound && document.location.pathname.match(/^\/courses\//) !== null) {
if (document.location.pathname.match(/^\/courses\/(2019-20-course-exam-description-pre-order-form|ap-course-audit|collaborations-with-ap|resources)/) !== null) {
bInclude = false;
bMatchFound = true;
}
if (!bMatchFound && document.location.pathname.match(/^\/courses\/.*/) !== null) {
bInclude = bMatchFound = (document.location.pathname.match(/^\/courses\/[^\/]*$/) !== null);
}
}
}
return bInclude;
/*
For the courses, URLs that end in the following should fire the chat, but any child pages under those directories should not:
โ€ข courses/_/course
โ€ข courses/_/exam
โ€ข courses/_/portfolio
Additionally, any course page URLs that end in the following or the child pages under them should not fire the chat:
โ€ข courses/_/course-audit
โ€ข courses/_/classroom-resources
โ€ข courses/_/professional-development
*/
/*
NOT HERE:
about-ap/news-changes/ap-2019/frequently-asked-questions
about-ap/how-ap-develops-courses-and-exams
about-ap/news-changes/collaborations-with-ap
about-ap/news-changes/ap-2019/support-students-new-online-tools
about-ap/start-grow-ap/access-initiatives
about-ap/start-grow-ap/ap-advocates-program
about-ap/start-grow-ap/grow-ap/spotlight-on-success
about-ap/start-grow-ap/outreach-support-resources
content
courses/2019-20-course-exam-description-pre-order-form
courses/ap-course-audit
courses/collaborations-with-ap
courses/resources
courses/_/[any not listed below], e.g.
courses/_/course-audit
courses/_/classroom-resources
courses/_/professional-development
courses/_/course/_
courses/_/exam/_
courses/_/portfolio/_
professional-development
score-reports-data/awards
series/[not listed below]
start-grow-ap/international
YES HERE:
(_ = any value) [any not listed above]
courses
/courses/exam-dates-and-fees
/courses/exam-dates-and-fees/_
courses/_
courses/_/course
courses/_/exam
courses/_/portfolio
courses/_/application-timeline
courses/_/exam-dates-2020
courses/_/late-testing-dates
courses/_/late-testing-dates-2020
series/ap-coordinator-tutorial
series/studio-art-submission-demo-ap-coordinators
series/studio-art-submission-demo-ap-teachers
*/
}],"event":"pagebottom"},
{"name":"Pixel - Alorica - Live Agent - CLEP","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5e7dfd8264746d122b0022a6.js"}]}]}],"scope":{"URI":{"include":[/^\/help-for-students(\/|$)/i]},"subdomains":{"include":[/^clep(-stg)?\.collegeboard\.org$/i]}},"event":"pagebottom"},
{"name":"Pixel - Aimtell","trigger":[{"command":"loadBlockingScript","arguments":[{"sequential":true,"scripts":[{"src":"satellite-5a5f68c664746d43530021ff.js"}]}]}],"scope":{"subdomains":{"include":[/^(advancesinap|apcentral|apcentral-stg|blog)\.collegeboard\.org/i,/^(collegereadiness|counselors|sat-stage)\.collegeboard\.org/i,/^(pages|pages-stg|parents)\.collegeboard\.org/i,/^(dreamdeferred|forum|nasai|preparate|regionalforums|newenglandforum|middlestatesforum|southernforum|midwesternforum|westernforum|southwesternforum)(-stg)?\.collegeboard\.org/i,/^(apac|apac-stg)\.collegeboard\.org/i,/^(opportunity|opportunity-stg)\.collegeboard\.org/i,/^(apstudents|apstudents-stg)\.collegeboard\.org/i]}},"event":"pagebottom"},
{"name":"Pixel - Aimtell - Page Views","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5e559fac64746d0821001c05.js"}]}]}],"scope":{"subdomains":{"include":[/^(apstudents|go|signup|pages)\.collegeboard\.org/i]}},"event":"windowload"},
{"name":"Pixel - Bing Ads","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5b4524fd64746d1adb00923e.js"}]}]}],"scope":{"domains":[/collegeboard\.org$/i]},"event":"pagebottom"},
{"name":"Pixel - DM - AdMedia","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5d6fb1c664746d5140000012.js"}]}]}],"scope":{"subdomains":{"include":[/^collegereadiness\.collegeboard\.org$/i]},"domains":[/collegeboard\.org$/i]},"event":"windowload"},
{"name":"Pixel - DM - JunGroup - Find Test Centers","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5e67d7aa64746d1ac400038d.js"}]}]}],"scope":{"URI":{"include":[/\/sat\/register\/find-test-centers/i]},"subdomains":{"include":[/^collegereadiness\.collegeboard\.org$/i]},"domains":[/collegeboard\.org$/i]},"event":"windowload"},
{"name":"Pixel - DM - Pinterest","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5ca38b0464746d2d09009456.js"}]}]}],"scope":{"URI":{"include":["about-ap/news-changes/ap-2019"]},"subdomains":{"include":[/^apcentral\.collegeboard\.org$/i]},"domains":[/collegeboard\.org$/i]},"event":"pagetop"},
{"name":"Pixel - Division D - TTD","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5d1a7e7364746d2e8b0012e8.js"}]}]}],"scope":{"URI":{"include":["cbos-pledge"]},"subdomains":{"include":[/^signup\.collegeboard\.org$/i]},"domains":[/collegeboard\.org$/i]},"event":"pagebottom"},
{"name":"Pixel - Division D - Yahoo","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5b9931d464746d6dc000024d.js"}]}]}],"scope":{"subdomains":{"include":[/^(bigfuture|collegereadiness|go|signup|studentscores)\.collegeboard\.org$/i]},"domains":[/collegeboard\.org$/i]},"conditions":[function(event,target){
/**
* Provided by Priya Shah in 2019-02
* https://jira.collegeboard.org/browse/WAP-2256
* Provided by Priya Shah on 2019-08-15
* https://jira.collegeboard.org/browse/WAP-3007
* Provided by Kristel Picinic on 2020-02-12
* https://jira.collegeboard.org/browse/WAP-3927
* Created by jbeach on 2019-02-13
* Updated by jbeach on 2019-08-16
*/
kiwi = window.kiwi || {};
kiwi.pixels = kiwi.pixels || {};
kiwi.pixels.divisiond = kiwi.pixels.divisiond || {};
kiwi.pixels.divisiond.yahoo = kiwi.pixels.divisiond.yahoo || {};
var cmet = true,
host = document.location.host,
path = document.location.pathname,
hash = document.location.hash;
kiwi.pixels.divisiond.yahoo.projectId = '10000';
kiwi.pixels.divisiond.yahoo.pixelId = '10063589';
switch (host) {
case 'bigfuture.collegeboard.org':
//display on specific pages
if (path.match(/^\/(scholarship-search|pay-for-college\/grants-scholarships|college-search)$/i)) {
cmet = true;
}
break;
case 'collegereadiness.collegeboard.org':
//display on specific pages
if (path.match(/^\/sat\/register\/find-test-centers$/i)) {
cmet = true;
}
break;
case 'go.collegeboard.org':
//display on specific pages
if (path.match(/^\/(your-)?best-test$/i)) { //Students + Parents Lead Form + Conversion
cmet = true;
}
break;
case 'signup.collegeboard.org':
//display on specific pages
if (path.match(/^\/next-step-sat\/$/i)) {
cmet = true;
}
break;
case 'studentscores.collegeboard.org':
//display on specific pages
if (path.match(/^\/viewscore$/i)) {
cmet = true;
}
break;
default:
break;
}
return cmet;
}],"event":"pagebottom"},
{"name":"Pixel - Facebook","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5b3fbc7264746d6050009413.js"}]}]}],"scope":{"subdomains":{"include":[/^(account|bigfuture|cbaccount|clep|clepportal|collegereadiness|go|nsat|opportunity|pages|parents|signup|studentscores)\.collegeboard\.org$/i]}},"conditions":[function(event,target){
/**
* Created by jbeach on 2019-08-09
* Updated by jbeach on 2020-02-18
*/
kiwi = window.kiwi || {};
kiwi.pixelTriggers = kiwi.pixelTriggers || {};
kiwi.pixelTriggers.fb = kiwi.pixelTriggers.fb || {};
kiwi.pixelTriggers.fb.cbMain = kiwi.pixelTriggers.fb.cbMain || {};
kiwi.pixelTriggers.fb.cbIndia = kiwi.pixelTriggers.fb.cbIndia || {};
var ruleName='KIWI: PLR > Pixel - Facebook > Condition';
_satellite.notify(ruleName);
var cmet = true,
host = document.location.host,
path = document.location.pathname,
hash = document.location.hash,
params = document.location.search;
switch (host) {
case 'bigfuture.collegeboard.org':
case 'clep.collegeboard.org':
case 'clepportal.collegeboard.org':
case 'collegereadiness.collegeboard.org':
case 'opportunity.collegeboard.org':
case 'parents.collegeboard.org':
case 'studentscores.collegeboard.org':
cmet = kiwi.pixelTriggers.fb.cbMain.init = true;
kiwi.pixelTriggers.fb.cbMain.view = true;
break;
case 'go.collegeboard.org':
cmet = kiwi.pixelTriggers.fb.cbMain.init = true;
kiwi.pixelTriggers.fb.cbMain.view = true;
//conversion event
if (path.match(/^\/(your-best-test|best-test)$/i) &&
hash.match(/^#thank-you/i)) {
kiwi.pixelTriggers.fb.cbMain.lead = true;
}
break;
case 'pages.collegeboard.org':
if (path.match(/^\/sat\/school-day/i)) {
cmet = kiwi.pixelTriggers.fb.cbMain.init = true;
kiwi.pixelTriggers.fb.cbMain.view = true;
}
break;
case 'nsat.collegeboard.org':
cmet = kiwi.pixelTriggers.fb.cbMain.init = true;
cmet = kiwi.pixelTriggers.fb.cbIndia.init = true;
//conversion events on specific pages - see DE > Kiwi > Custom Events
break;
case 'signup.collegeboard.org':
//view event
if (path.match(/^\/international-sat($|\/)/i)) {
cmet = kiwi.pixelTriggers.fb.cbIndia.init = true;
kiwi.pixelTriggers.fb.cbIndia.view = true;
}
break;
case 'account.collegeboard.org':
//weed out appId=229 (SSD MP3 App)
if (!(params.match(/appId=229/i)) && path.match(/^\/(login\/(login|signUp))$/i)) {
cmet = kiwi.pixelTriggers.fb.cbIndia.init = true;
kiwi.pixelTriggers.fb.cbIndia.view = true;
}
break;
case 'cbaccount.collegeboard.org':
cmet = kiwi.pixelTriggers.fb.cbIndia.init = true; //capture account creation on subdomain confirmation page
if (path.match(/^\/(iamweb\/(smartRegister|registerAccount))$/i)) {
kiwi.pixelTriggers.fb.cbIndia.view = true;
}
break;
default:
break;
}
return cmet;
}],"event":"pagetop"},
{"name":"Pixel - Google Tag - CB India","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5db0501264746d34d4000071.js"}]}]}],"scope":{"subdomains":{"include":[/^(account|cbaccount|nsat|signup)\.collegeboard\.org$/i]},"domains":[/collegeboard\.org$/i]},"event":"pagebottom"},
{"name":"Pixel - Google Tag - CB India 2","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5e34689464746d0c4e0009d8.js"}]}]}],"scope":{"subdomains":{"include":[/^(account|cbaccount|nsat|signup)\.collegeboard\.org$/i]},"domains":[/collegeboard\.org$/i]},"event":"pagebottom"},
{"name":"Pixel - Google Tag - CB LP","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5d6eaff964746d0c4f0006ab.js"}]}]}],"scope":{"subdomains":{"include":[/^(account|bigfuture|cbaccount|clep|collegereadiness|go|nsat|signup)\.collegeboard\.org$/i]},"domains":[/collegeboard\.org$/i]},"event":"pagebottom"},
{"name":"Pixel - Google Tag - CB Main","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5b44fdc364746d17900089e9.js"}]}]}],"scope":{"subdomains":{"include":[/^(account|apstudents|bigfuture|cbaccount|clep|clepportal|collegereadiness|go|nsat|pages|parents|signup|studentscores|www)\.collegeboard\.org$/i]}},"event":"pagebottom"},
{"name":"Pixel - OneTrust","trigger":[{"command":"writeHTML","arguments":[{"html":"\u003c!-- OneTrust Cookies Consent Notice (Production CDN, collegeboard.org, en-GB) start --\u003e\n\u003cscript src=\"https://cdn.cookielaw.org/consent/3700e0a7-263f-4b29-87c0-e1c5fcf7ed80.js\" type=\"text/javascript\" charset=\"UTF-8\"\u003e\u003c/script\u003e\n\u003cscript type=\"text/javascript\"\u003e\n function OptanonWrapper() { }\n\u003c/script\u003e\n\u003c!-- OneTrust Cookies Consent Notice (Production CDN, collegeboard.org, en-GB) end --\u003e\n"}]}],"scope":{"subdomains":{"exclude":[/\.overturecorp\.com$/i,/\.springboardonline\.org$/i,/flossyourscore\.com$/i]}},"event":"pagebottom"},
{"name":"Pixel - SnapChat","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5c705b1964746d101a0008bf.js"}]}]}],"scope":{"subdomains":{"include":[/^(?:opportunity|eyf)(?:(?:-.*)?\.collegeplanning-(?:non)?prod)?\.collegeboard\.org$/i,/^(account|cbaccount|nsat|signup)\.collegeboard\.org$/i]}},"event":"pagebottom"},
{"name":"Pixel - UX - Lucky Orange","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-57d84a9d64746d4d4100dc5e.js"}]}]}],"scope":{"domains":[/apscore\.org$/i,/collegeboard\.com$/i,/collegeboard\.org$/i]},"event":"pagebottom"},
{"name":"Set Cookie - viewed_college_plan","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5d8a5d8364746d424a000dcc.js"}]}]}],"scope":{"URI":{"include":[/\/fp-your-college-plan-11$/i]},"subdomains":{"include":[/^pages\.collegeboard\.org$/i]},"domains":[/collegeboard\.org$/i]},"event":"pagebottom"},
{"name":"Survey - GetSiteControl - 2 APS Intercept","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-580fa55364746d38fe0099bd.js"}]}]}],"scope":{"subdomains":{"include":[/^(apstudents)\.collegeboard\.org$/i]}},"event":"pagebottom"},
{"name":"Survey - GetSiteControl - 3 Dynamic Intercept","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5cc06f4964746d5d38000664.js"}]}]}],"scope":{"subdomains":{"include":[/^apcentral\.collegeboard\.org$/i]}},"event":"pagebottom"},
{"name":"Survey - GetSiteControl - 4 Dynamic Intercept 2","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5d80ec1964746d4b5e0000ed.js"}]}]}],"scope":{"subdomains":{"include":[/^opportunity\.collegeboard\.org$/i]}},"event":"pagebottom"},
{"name":"Survey - GetSiteControl - 5 Dynamic Intercept","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5db0a6ee64746d728900014b.js"}]}]}],"scope":{"subdomains":{"include":[/^(collegereadiness|nsat|studentscores|k12reports)\.collegeboard\.org$/i]}},"conditions":[function(event,target){
var cmet = false,
h = document.location.host,
p = document.location.pathname,
isLowerEnv = false,
isProdEnv = true;
if (typeof window.cbEnvLower) {
isLowerEnv = (typeof window.cbEnvLower === 'boolean')
?window.cbEnvLower
:(window.cbEnvLower === 'true');
isProdEnv = !isLowerEnv;
}
if (typeof window.cbEnv) {
isProdEnv = (window.cbEnv === 'prod');
isLowerEnv = !isProdEnv;
}
switch (h) {
case 'nsat.collegeboard.org':
//display only on non-lower/prod environments
cmet = isProdEnv;
break;
default:
//display everywhere
cmet = true;
break;
}
return cmet;
}],"event":"pagebottom"},
{"name":"Survey - GetSiteControl - Apricot Form Fix","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-57d8406964746d192c00efc1.js"}]}]}],"scope":{"domains":[/apscore\.org$/i,/collegeboard\.com$/i,/collegeboard\.org$/i]},"event":"pagebottom"},
{"name":"Survey - GetSiteControl - BigFuture","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5b85639364746d7f9d002c8d.js"}]}]}],"scope":{"subdomains":{"include":[/^bigfuture\.collegeboard\.org$/i]},"domains":[/collegeboard\.org$/i]},"event":"pagebottom"},
{"name":"Survey - GetSiteControl - Usability","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-57d8472b64746d57f400639c.js"}]}]}],"scope":{"URI":{"exclude":[/^\/fp-/i]},"subdomains":{"exclude":[/^(accommodations|go|ssd|signup)\.collegeboard\.org$/i,/^(testday|(dev|qa|uat)-tdtk\.fed-nonprod)\.collegeboard\.org$/i,/^(finaidportalbeta|finaidportal|idoc|idocbeta|cssprofile|profilebeta|profile)\.collegeboard\.org$/i,/^latam\.collegeboard\.org$/i,/^collegeboardsearch\.collegeboard\.org$/i,/^ap2020studentresponses\.collegeboard\.org$/i]},"domains":[/apscore\.org$/i,/collegeboard\.com$/i,/collegeboard\.org$/i]},"conditions":[function(event,target){
/**
* Created by jbeach on 2020-04-14
* Updated by jbeach on 2020-04-14
*/
var cmet = false,
h = document.location.host,
p = document.location.pathname,
cbEnvLower = 'false';
if (typeof window.cbEnvLower) {
cbEnvLower = window.cbEnvLower;
}
switch (h) {
case 'nsat.collegeboard.org':
case 'satscoresends.collegeboard.org':
//display only on non-lower/prod environments
cmet = !cbEnvLower;
break;
default:
//display everywhere
cmet = true;
break;
}
return cmet;
}],"event":"pagebottom"},
{"name":"Survey - Helpflns (SG) - AP Sites","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5e67a15c64746d600b0007a8.js"}]}]}],"scope":{"subdomains":{"include":[/^apstudents(-(origin|stg|dev))?\.collegeboard\.org$/i,/^apcentral(-(origin|stg|dev))?\.collegeboard\.org$/i,/^apcoronavirusupdates(-(origin|stg|dev))?\.collegeboard\.org$/i,/^aphighered(-(origin|stg|dev))?\.collegeboard\.org$/i]}},"conditions":[function(event,target){
/**
* Created by jbeach on 2018-10-29
* Updated by jbeach on 2020-04-03
*/
var cmet = false,
h = document.location.host,
p = document.location.pathname;
switch (h) {
case 'apstudents-dev.collegeboard.org':
case 'apstudents-stg.collegeboard.org':
case 'apstudents-origin.collegeboard.org':
case 'apstudents.collegeboard.org':
case 'apcentral-dev.collegeboard.org':
case 'apcentral-stg.collegeboard.org':
case 'apcentral-origin.collegeboard.org':
case 'apcentral.collegeboard.org':
//display everywhere except root/home page
if (!(p.match(/^\/$/i))) {
cmet = true;
}
break;
default:
//display everywhere
cmet = true;
break;
}
return cmet;
}],"event":"pagebottom"},
{"name":"Survey - Helpflns (SG) - International","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5ef3c09c64746d7f6b001fd9.js"}]}]}],"scope":{"subdomains":{"include":[/^international(-(origin|stg|dev))?\.collegeboard\.org$/i]}},"event":"pagebottom"},
{"name":"Survey - Helpflns (SG) - Membership","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5ee966e264746d6fc400122d.js"}]}]}],"scope":{"subdomains":{"include":[/^membership(-(origin|stg|dev))?\.collegeboard\.org$/i]}},"event":"pagebottom"}
],
"rules": [
{"name":"BFCL Widget - Login Modal Shown","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"BFCL Widget - Login Modal"}]}],"selector":"html","eventHandlerOnElement":true,"event":"custom","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false,"customEvent":"kiwi.widgetScreenTrack.bfclLoginModal"},
{"name":"BFCL Widget - Popover Dismissed","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"BFCL Widget - Popover Dismissed"}]}],"selector":"html","eventHandlerOnElement":true,"event":"custom","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false,"customEvent":"kiwi.widgetScreenTrack.bfclHide"},
{"name":"BFCL Widget - Popover Shown","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Widget Screen - BFCL Widget"}]}],"selector":"html","eventHandlerOnElement":true,"event":"custom","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false,"customEvent":"kiwi.widgetScreenTrack.bfclShow"},
{"name":"Click - Accordion Expand","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Feature Used - Accordion","customSetup":function(event,s){
/**
* Created by jbeach on 2019-01-23
* Updated by jbeach on 2019-01-23
*/
kiwi = window.kiwi || {};
var ruleName='KIWI: EBR > Click - Accordion Expand > Analytics JS';
_satellite.notify(ruleName);
kiwi._elementToTest = this;
}}]}],"selector":"[data-cbtrack-accordion] a, [data-cbtrack-accordion] button","eventHandlerOnElement":true,"event":"click","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"Click - Auto-Suggested Term Search Link","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Auto-Suggested Term Search Link"}]}],"selector":"[data-cbtrack-linkgroup=\"search-sugg\"] [data-cbtrack-linktype=\"nav\"], .lv-search-widget .lv-suggestions li a","eventHandlerOnElement":true,"event":"click","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"Click - CBOS Opt Out","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5ca63d0c64746d78ba00342f.js"}]}]}],"selector":".cbos-main #optOutModal #opt-out-yes","event":"click","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"Click - CBOS Terms Accept","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"CBOS Terms Accept"}]}],"selector":"[data-cbtrack-cbos-optin]:not([disabled])","event":"click","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"Click - CTA Card","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Feature Used - CTA Card","customSetup":function(event,s){
/**
* Created by jbeach on 2019-05-02
* Updated by jbeach on 2019-05-02
*/
kiwi = window.kiwi || {};
var ruleName='KIWI: EBR > Click - CTA Card > Analytics JS';
_satellite.notify(ruleName);
kiwi._elementToTest = this;
}}]}],"selector":"[data-cbtrack-ctacard] a, [data-cbtrack-ctacard] button","eventHandlerOnElement":true,"event":"click","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"Click - Confirm ECL Account Create","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Confirm ECL Account Create"}]}],"scope":{"URI":{"include":[/^\/iamweb\/registerAccount/i]},"subdomains":{"include":[/^cbaccount\.collegeboard\.org$/i]},"domains":[/collegeboard\.org$/i]},"conditions":[function(event,target){
/**
* Created by jbeach on 2019-10-31
* Updated by jbeach on 2019-10-31
*/
var cmet = false,
strAriaDisabledVal = this.getAttribute('aria-disabled');
if (strAriaDisabledVal && strAriaDisabledVal.match(/^false$/i)) {
cmet = true;
}
return cmet;
}],"selector":"button#registerAccount","event":"click","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"Click - Crosslink","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Feature Used - Crosslink","customSetup":function(event,s){
/**
* Created by jbeach on 2019-04-12
* Updated by jbeach on 2019-04-12
*/
kiwi = window.kiwi || {};
var ruleName='KIWI: EBR > Click - Crosslink > Analytics JS';
_satellite.notify(ruleName);
kiwi._elementToTest = this;
}}]}],"selector":"[data-cbtrack-crosslink]","eventHandlerOnElement":true,"event":"click","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"Click - Download Link","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"d","linkName":"Download Link","customSetup":function(event,s){
/**
* Created by jbeach on 2016-12-02
* Updated by jbeach on 2018-01-19
*/
kiwi = window.kiwi || {};
var ruleName='KIWI: EBR > Click - Download Link > Analytics JS';
_satellite.notify(ruleName);
kiwi._elementToTest = this;
}}]},{"command":"delayActivateLink"}],"selector":"a","property":{"href":/\.(?:arf|avi|css|csv|dmg|doc|docx|dotx|eps|exe|ics|js|m4v|mov|mp3|mp4|mpg|pages|pdf|ppt|pptx|rar|rm|rtf|swf|tab|txt|vsd|vxd|wav|wma|wmv|xls|xlsx|xml|zip)($|\&|\?)/i},"event":"click","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"Click - Dynamic Download Link","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Dynamic Download Link","customSetup":function(event,s){
/**
* Created by jbeach on 2016-12-02
* Updated by jbeach on 2018-01-19
*/
kiwi = window.kiwi || {};
var ruleName='KIWI: EBR > Click > Dynamic Download Link > Analytics JS';
_satellite.notify(ruleName);
kiwi._elementToTest = this;
}}]}],"selector":"[dynamic-asset-link-track],[data-cbtrack-download],[download]","event":"click","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"Click - Event Card","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Feature Used - Event Card","customSetup":function(event,s){
/**
* Created by jbeach on 2019-05-17
* Updated by jbeach on 2019-05-17
*/
kiwi = window.kiwi || {};
var ruleName='KIWI: EBR > Click - Event Card > Analytics JS';
_satellite.notify(ruleName);
kiwi._elementToTest = this;
}}]}],"selector":"[data-cbtrack-ec] a, [data-cbtrack-ec] button","eventHandlerOnElement":true,"event":"click","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"Click - Exit Link - New Tab","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"e","linkName":"Exit Link","customSetup":function(event,s){
/**
* Created by jbeach on 2016-12-02
* Updated by jbeach on 2018-01-19
*/
kiwi = window.kiwi || {};
var ruleName='KIWI: EBR > Click - Exit Link - New Tab > Analytics JS';
_satellite.notify(ruleName);
kiwi._elementToTest = this;
//if (_satellite.getVar('Async Promo Link Fired')) s.abort;
}}]}],"conditions":[function(event,target){
/**
* Created by jbeach on 2017-02-16
* Updated by jbeach on 2017-03-21
*/
//NEW TAB LOGIC
//check if outbound link
var cmet = false,
outBoundLink = _satellite.isOutboundLink(this),
newTab = false;
if (outBoundLink) {
//check if link opens in a new tab and if not so, set false
var myTarget = this.getAttribute('target'),
myDataTarget = this.getAttribute('data-target'),
myClass = this.getAttribute('class');
if (myTarget && myTarget.match(/^(_blank|_new)$/i)) {
newTab = true;
} else if (myDataTarget && myDataTarget.match(/^new-window$/i)) {
newTab = true;
} else if (myClass && myClass.match(/(?: |^)nav-item(?: |$)/i)) {//temp logic for SSR + RTN pop tools links until they can use data-target attribute
newTab = true;
}
}
cmet = outBoundLink && newTab;
return cmet;
}],"selector":"a","event":"click","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"Click - Exit Link - Same Tab","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"e","linkName":"Exit Link","customSetup":function(event,s){
/**
* Created by jbeach on 2016-12-02
* Updated by jbeach on 2018-01-19
*/
kiwi = window.kiwi || {};
var ruleName='KIWI: EBR > Click - Exit Link - Same Tab > Analytics JS';
_satellite.notify(ruleName);
kiwi._elementToTest = this;
}}]},{"command":"delayActivateLink"}],"conditions":[function(event,target){
/**
* Created by jbeach on 2017-02-16
* Updated by jbeach on 2017-03-14
*/
//SAME TAB LOGIC
//check if outbound link
var cmet = _satellite.isOutboundLink(this);
if (cmet) {
//check if link opens in a new tab and if so, set false
var myTarget = this.getAttribute('target'),
myDataTarget = this.getAttribute('data-target'),
myClass = this.getAttribute('class');
if (myTarget && myTarget.match(/^(_blank|_new)$/i)) {
cmet = false;
} else if (myDataTarget && myDataTarget.match(/^new-window$/i)) {
cmet = false;
} else if (myClass && myClass.match(/(?: |^)nav-item(?: |$)/i)) {//temp logic for SSR + RTN pop tools links until they can use data-target attribute
cmet = false;
}
}
return cmet;
}],"selector":"a","event":"click","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"Click - FW Eligibility","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Feature Used - Custom","customSetup":function(event,s){
/**
* Created by jbeach on 2019-03-25
* Updated by jbeach on 2019-03-25
*/
kiwi = window.kiwi || {};
var ruleName='KIWI: EBR > Click - FW Eligibility > Analytics JS';
_satellite.notify(ruleName);
kiwi._elementToTest = this;
}}]}],"scope":{"subdomains":{"include":[/^nsat\.collegeboard\.org$/i]}},"selector":"#s2-fwEligibilitymodal-continueButton","event":"click","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"Click - Feature","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Feature Used - Feature","customSetup":function(event,s){
kiwi = window.kiwi || {};
var ruleName='KIWI: EBR > Click - Feature > Analytics JS';
_satellite.notify(ruleName);
kiwi._elementToTest = this;
}}]}],"selector":"[data-kiwi-featureclick]","event":"click","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"Click - Feature (Legacy)","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Feature","customSetup":function(event,s){
/**
* Created by jbeach on 2018-04-19
*/
kiwi = window.kiwi || {};
var ruleName='KIWI: EBR > Click - Feature > Analytics JS';
_satellite.notify(ruleName);
kiwi._elementToTest = this;
}}]},{"command":"delayActivateLink"}],"selector":"[data-cbtrack]","event":"click","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"Click - Filter Apply","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Feature Used - Filter","customSetup":function(event,s){
/**
* Created by jbeach on 2019-01-16
* Updated by jbeach on 2019-01-16
*/
kiwi = window.kiwi || {};
var ruleName='KIWI: EBR > Click - Filter Applied > Analytics JS';
_satellite.notify(ruleName);
kiwi._elementToTest = this.closest('[data-cbtrack-filter]');
}}]},{"command":"delayActivateLink"}],"selector":"[data-cbtrack-filter] .cb-filter-apply, [data-cbtrack-filter] form [type=\"submit\"], [data-cbtrack-filter] [name=\"lv-form-college-search-submit\"]","eventHandlerOnElement":true,"event":"click","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"Click - Iframe Report Link","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Iframe Report Link","customSetup":function(event,s){
/**
* Created by jbeach on 2019-05-06
* Updated by jbeach on 2019-05-06
*/
kiwi = window.kiwi || {};
var ruleName='KIWI: EBR > Click > Iframe Report Link > Analytics JS';
_satellite.notify(ruleName);
kiwi._elementToTest = this;
}}]}],"selector":"[data-cbtrack-iframereport]","event":"click","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"Click - Jump Link Jump","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Feature Used - Jump Link","customSetup":function(event,s){
/**
* Created by jbeach on 2019-02-05
* Updated by jbeach on 2019-02-05
*/
kiwi = window.kiwi || {};
var ruleName='KIWI: EBR > Click - Jump Link Jump > Analytics JS';
_satellite.notify(ruleName);
kiwi._elementToTest = this;
}}]}],"selector":".cb-jumplinks-menu a, .cb-jumplinks-container .cb-jumplinks-back, #help-topics + ul li a, a[href=\"#help-topics\"]","eventHandlerOnElement":true,"event":"click","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"Click - Key Benefit","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Feature Used - Key Benefit","customSetup":function(event,s){
/**
* Created by jbeach on 2019-11-19
* Updated by jbeach on 2019-11-19
*/
kiwi = window.kiwi || {};
var ruleName='KIWI: EBR > Click - Key Benefit > Analytics JS';
_satellite.notify(ruleName);
kiwi._elementToTest = this;
}}]}],"selector":"[data-cbtrack-keybenefits] a, [data-cbtrack-keybenefits] button","eventHandlerOnElement":true,"event":"click","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"Click - LIFW Opt In Form","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"LIFW Opt In Form Submit"}]}],"conditions":[function(event,target){
/**
* Created by jbeach on 2018-11-26
* Created by jbeach on 2018-11-27
*/
var ruleName='KIWI: Data Element > Data - LIFW Form';
var result = { hasData: false };
//collect data
var form = document.querySelector('form[data-cbtrack-lifw]');
if(form) {
var liQualChecked = form.querySelector('input[name=liQual]:checked');
if (liQualChecked) {
result = {
hasData: true,
liQualOption: (liQualChecked.value==='true')?true:false
};
}
}
if (result.hasData) _satellite.notify(ruleName+': '+ JSON.stringify(result));
return result;
}],"selector":"form[data-cbtrack-lifw] button","event":"click","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"Click - LIFW Opt In Link","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"LIFW Opt In"}]}],"selector":"[data-cbtrack-lifw-optin]","event":"click","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"Click - LIFW Opt Out Link","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"LIFW Opt Out"}]}],"selector":"[data-cbtrack-lifw-optout]","event":"click","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"Click - Layout Panel","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Feature Used - Layout Panel","customSetup":function(event,s){
/**
* Created by jbeach on 2019-05-17
* Updated by jbeach on 2019-05-17
*/
kiwi = window.kiwi || {};
var ruleName='KIWI: EBR > Click - Layout Panel > Analytics JS';
_satellite.notify(ruleName);
kiwi._elementToTest = this;
}}]}],"selector":"[data-cbtrack-layp] a, [data-cbtrack-layp] button","eventHandlerOnElement":true,"event":"click","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"Click - NSAT - ST Listening Avail (EBR)","trigger":[{"command":"loadScript","arguments":[{"sequential":true,"scripts":[{"src":"satellite-5ed69ff564746d4c010026ba.js"}]}]}],"scope":{"subdomains":{"include":[/^nsat\.collegeboard\.org$/i]}},"selector":"#satTestDateTabs, #testTypeSubjects","event":"click","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"Click - Nav Link","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Nav Link","customSetup":function(event,s){
/**
* Created by jbeach on 2016-11-11
* Updated by jbeach on 2018-06-21
kiwi = window.kiwi || {};
var ruleName='KIWI: EBR > Click - Nav Link > Analytics JS';
_satellite.notify(ruleName);
kiwi.skipTrackNav = true;
var ckname = 'cbtrack_nav',
ckval = this.getAttribute('data-cbtrack-nav');
//set cookie on main domain (not subdomain) for next page track to catch
document.cookie = ckname+'='+ckval+'; path=/; domain=.collegeboard.org';
s.abort = true;
kiwi.urlToParse = this.href.toLowerCase();
var parsedSiteCode = _satellite.getVar('Site Code');
//reset dtmData.urlToParse after parsed
kiwi.urlToParse = '';
if(_satellite.textMatch(parsedSiteCode, kiwi.config.subdomainsRegex.legacyWAP)) {
_satellite.setVar('Nav Link', url);
_satellite.track('cbTrack.legacySupport.click.navLink');
}
//_satellite.notify(ruleName+': url.href: '+ url);
//_satellite.notify(ruleName+': '+ckname+ ': '+ _satellite.readCookie(ckname));
*/
kiwi = window.kiwi || {};
var ruleName='KIWI: EBR > Click - Nav Link > Analytics JS';
_satellite.notify(ruleName);
kiwi._elementToTest = this;
}}]},{"command":"delayActivateLink"}],"conditions":[function(event,target){
/**
* Created by jbeach on 2018-06-19
* Updated by jbeach on 2020-05-13
*/
var ruleName='KIWI: Click - Nav Link > Condition';
//_satellite.notify(ruleName);
var cmet = false;
var toggleLink = !(this.hasAttribute('data-toggle')) || false,
tntLink = !(this.hasAttribute('data-kiwi-tntpromo-link')) || false;
cmet = !toggleLink && !tntLink;
return cmet;
}],"selector":"[data-cbtrack-nav][data-cbtrack-delay]","eventHandlerOnElement":true,"event":"click","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"Click - Nav Link - No Delay","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Nav Link","customSetup":function(event,s){
/**
* Created by jbeach on 2016-11-11
* Updated by jbeach on 2018-10-31
*/
kiwi = window.kiwi || {};
var ruleName='KIWI: EBR > Click - Nav Link > Analytics JS';
_satellite.notify(ruleName);
kiwi._elementToTest = this;
}}]}],"conditions":[function(event,target){
/**
* Created by jbeach on 2018-06-19
* Updated by jbeach on 2020-05-13
*/
var ruleName='KIWI: Click - Nav Link - No Delay > Condition';
//_satellite.notify(ruleName);
var cmet = false;
var toggleLink = !(this.hasAttribute('data-toggle')) || false,
tntLink = !(this.hasAttribute('data-kiwi-tntpromo-link')) || false;
cmet = !toggleLink && !tntLink;
return cmet;
}],"selector":"[data-cbtrack-nav][data-cbtrack-nodelay]","eventHandlerOnElement":true,"event":"click","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"Click - Promo Link - New Tab","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Promo Link","customSetup":function(event,s){
/**
* Created by jbeach on 2016-12-01
* Updated by jbeach on 2018-01-19
*/
kiwi = window.kiwi || {};
var ruleName='KIWI: EBR > Click - Promo Link - New Tab > Analytics JS';
_satellite.notify(ruleName);
kiwi._elementToTest = this;
}}]}],"conditions":[function(event,target){
/**
* Created by jbeach on 2019-10-08
* Updated by jbeach on 2020-05-13
*/
kiwi = window.kiwi || {};
kiwi.util = kiwi.util || {};
kiwi.util.isDownloadLink = kiwi.util.isDownloadLink || function() {_satellite.notify('Missing function: kiwi.util.isDownloadLink!'); return false;};
var ruleName='KIWI: EBR > Click - Promo Link - New Tab > Condition';
var cmet = false;
if (kiwi._thisPage.siteSettings.use2017promos) {
var outBoundLink = _satellite.isOutboundLink(this),
downloadLink = kiwi.util.isDownloadLink(this),
tntLink = this.hasAttribute('data-kiwi-tntpromo-link');
cmet = !outBoundLink && !downloadLink && !tntLink;
}
return cmet;
}],"selector":"a[href*=\"affiliateId=\"][href*=\"bannerId=\"]","property":{"target":/^_blank$/i},"event":"click","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"Click - Promo Link - Same Tab","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Promo Link","customSetup":function(event,s){
/**
* Created by jbeach on 2016-12-01
* Updated by jbeach on 2018-01-19
*/
kiwi = window.kiwi || {};
var ruleName='KIWI: EBR > Click - Promo Link - Same Tab > Analytics JS';
_satellite.notify(ruleName);
kiwi._elementToTest = this;
}}]},{"command":"delayActivateLink"}],"conditions":[function(event,target){
/**
* Created by jbeach on 2019-10-08
* Updated by jbeach on 2020-05-13
*/
kiwi = window.kiwi || {};
kiwi.util = kiwi.util || {};
kiwi.util.isDownloadLink = kiwi.util.isDownloadLink || function() {_satellite.notify('Missing function: kiwi.util.isDownloadLink!'); return false;};
var ruleName='KIWI: EBR > Click - Promo Link - Same Tab > Condition';
var cmet = false;
if (kiwi._thisPage.siteSettings.use2017promos) {
var outBoundLink = _satellite.isOutboundLink(this),
downloadLink = kiwi.util.isDownloadLink(this),
tntLink = this.hasAttribute('data-kiwi-tntpromo-link');
cmet = !outBoundLink && !downloadLink && !tntLink;
}
return cmet;
}],"selector":"a[href*=\"affiliateId=\"][href*=\"bannerId=\"]","property":{"target":/^(?!_blank$).*/i},"event":"click","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"Click - Promo Link 2019 - Delay","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Promo Link 2019","customSetup":function(event,s){
/**
* Created by jbeach on 2018-12-03
* Updated by jbeach on 2018-12-03
*/
kiwi = window.kiwi || {};
var ruleName='KIWI: EBR > Click - Promo Link 2019 > Analytics JS';
_satellite.notify(ruleName);
kiwi._elementToTest = this;
}}]},{"command":"delayActivateLink"}],"conditions":[function(event,target){
/**
* Created by jbeach on 2019-10-08
* Updated by jbeach on 2020-05-07
*/
kiwi = window.kiwi || {};
kiwi.util = kiwi.util || {};
kiwi.util.isDownloadLink = kiwi.util.isDownloadLink || function() {_satellite.notify('Missing function: kiwi.util.isDownloadLink!'); return false;};
var ruleName='KIWI: EBR > Click - Promo Link 2019 > Condition';
var cmet = false,
outBoundLink = _satellite.isOutboundLink(this),
downloadLink = kiwi.util.isDownloadLink(this),
tntLink = this.hasAttribute('data-kiwi-tntpromo-link');
cmet = !outBoundLink && !downloadLink && !tntLink;
return cmet;
}],"selector":"[data-kiwi-promo-link][data-cbtrack-delay]","eventHandlerOnElement":true,"event":"click","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"Click - Promo Link 2019 - No Delay","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Promo Link 2019","customSetup":function(event,s){
/**
* Created by jbeach on 2018-12-03
* Updated by jbeach on 2018-12-03
*/
kiwi = window.kiwi || {};
var ruleName='KIWI: EBR > Click - Promo Link 2019 > Analytics JS';
_satellite.notify(ruleName);
kiwi._elementToTest = this;
}}]}],"conditions":[function(event,target){
/**
* Created by jbeach on 2019-10-08
* Updated by jbeach on 2020-05-07
*/
kiwi = window.kiwi || {};
kiwi.util = kiwi.util || {};
kiwi.util.isDownloadLink = kiwi.util.isDownloadLink || function() {_satellite.notify('Missing function: kiwi.util.isDownloadLink!'); return false;};
var ruleName='KIWI: EBR > Click - Promo Link 2019 > Condition';
var cmet = false,
outBoundLink = _satellite.isOutboundLink(this),
downloadLink = kiwi.util.isDownloadLink(this),
tntLink = this.hasAttribute('data-kiwi-tntpromo-link');
cmet = !outBoundLink && !downloadLink && !tntLink;
return cmet;
}],"selector":"[data-kiwi-promo-link][data-cbtrack-nodelay]","eventHandlerOnElement":true,"event":"click","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"Click - Promo Link TnT - Delay","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Promo Link TnT","customSetup":function(event,s){
/**
* Created by jbeach on 2020-04-07
* Updated by jbeach on 2020-04-07
*/
kiwi = window.kiwi || {};
var ruleName='KIWI: EBR > Click - Promo Link TnT > Analytics JS';
_satellite.notify(ruleName);
kiwi._elementToTest = this;
}}]},{"command":"delayActivateLink"}],"conditions":[function(event,target){
/**
* Created by jbeach on 2020-04-07
* Updated by jbeach on 2020-04-07
*/
kiwi = window.kiwi || {};
kiwi.util = kiwi.util || {};
kiwi.util.isDownloadLink = kiwi.util.isDownloadLink || function() {_satellite.notify('Missing function: kiwi.util.isDownloadLink!'); return false;};
var ruleName='KIWI: EBR > Click - Promo Link TnT > Condition';
var cmet = false,
outBoundLink = _satellite.isOutboundLink(this),
downloadLink = kiwi.util.isDownloadLink(this);
cmet = !outBoundLink && !downloadLink;
return cmet;
}],"selector":"[data-kiwi-tntpromo-link][data-cbtrack-delay]","eventHandlerOnElement":true,"event":"click","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"Click - Promo Link TnT - No Delay","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Promo Link TnT","customSetup":function(event,s){
/**
* Created by jbeach on 2020-04-07
* Updated by jbeach on 2020-04-07
*/
kiwi = window.kiwi || {};
var ruleName='KIWI: EBR > Click - Promo Link TnT > Analytics JS';
_satellite.notify(ruleName);
kiwi._elementToTest = this;
}}]}],"conditions":[function(event,target){
/**
* Created by jbeach on 2020-04-07
* Updated by jbeach on 2020-04-07
*/
kiwi = window.kiwi || {};
kiwi.util = kiwi.util || {};
kiwi.util.isDownloadLink = kiwi.util.isDownloadLink || function() {_satellite.notify('Missing function: kiwi.util.isDownloadLink!'); return false;};
var ruleName='KIWI: EBR > Click - Promo Link TnT > Condition';
var cmet = false,
outBoundLink = _satellite.isOutboundLink(this),
downloadLink = kiwi.util.isDownloadLink(this);
cmet = !outBoundLink && !downloadLink;
return cmet;
}],"selector":"[data-kiwi-tntpromo-link][data-cbtrack-nodelay]","eventHandlerOnElement":true,"event":"click","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"Click - Search Result","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Search Result Click","customSetup":function(event,s){
/**
* Created by jbeach on 2019-10-29
* Updated by jbeach on 2019-10-29
*/
kiwi = window.kiwi || {};
var ruleName='KIWI: EBR > Click - Search Result > Analytics JS';
_satellite.notify(ruleName);
kiwi._elementToTest = this;
}}]}],"selector":"a[data-cbtrack-searchresult], [data-cbtrack-searchresult] a, [data-kiwi-sspromo-link], #sitesearch .lv-results a","event":"click","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"Click - Site Search Link","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Search Result Click","customSetup":function(event,s){
/**
* Created by jbeach on 2016-10-xx
* Updated by jbeach on 2018-01-19
*/
kiwi = window.kiwi || {};
var ruleName='KIWI: EBR > Click - Site Search Link > Analytics JS';
_satellite.notify(ruleName);
kiwi._elementToTest = this;
}}]},{"command":"delayActivateLink"}],"conditions":[function(event,target){
/**
* Created by jbeach on 2016
* Updated by jbeach on 2017-05-09
*/
var cmet = false;
if (document.location.host.match(/^www(-dev|-stg)?\.collegeboard\.org$/i)) {
if (document.location.pathname.match(/^\/search$/)) {
cmet = true;
}
} else if (document.location.host.match(/^(stage\.)?sitesearch\.collegeboard\.org$/i)) {
cmet = true;
} else if (document.location.host.match(/^bigfuture(qa\.nmd)?\.collegeboard\.org$/i)) {
if (document.location.pathname.match(/^\/sitesearch/)) {
cmet = true;
}
} else if (document.location.host.match(/^apstudent\.collegeboard\.org$/i)) {
if (document.location.pathname.match(/^\/search/)) {
cmet = true;
}
} else if (document.location.host.match(/^widgetgallery\.nmd\.collegeboard\.org$/i)) {
if (document.location.pathname.match(/^\/widgets-repo-src\/widgets\/demo\/app-search/i)) {
cmet = true;
}
}
return cmet;
}],"selector":".search-results a, .trustee-search a, #allSearchResults a, .related-search a, .grid_9.omega a.arial, #searchResults a.siteSearchLink, #content.hasNavRail .productbox a","event":"click","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"Click - Widget","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Feature Used - Widget","customSetup":function(event,s){
/**
* Created by jbeach on 2019-03-20
* Updated by jbeach on 2019-03-20
*/
kiwi = window.kiwi || {};
var ruleName='KIWI: EBR > Click - Widget > Analytics JS';
_satellite.notify(ruleName);
kiwi._elementToTest = this;
}}]}],"selector":"[data-cbtrack-widget] a[data-cbtrack-linktype], [data-cbtrack-widget] button[data-cbtrack-linktype]","eventHandlerOnElement":true,"event":"click","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"Custom - Hide Modal - FW Eligibility","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Feature Used - Custom","customSetup":function(event,s){
/**
* Created by jbeach on 2019-03-25
* Updated by jbeach on 2019-03-25
*/
kiwi = window.kiwi || {};
var ruleName='KIWI: EBR > Custom - Hidden - FW Eligibility > Analytics JS';
_satellite.notify(ruleName);
kiwi._elementToTest = this;
}}]}],"selector":"#fwEligibilityModal","eventHandlerOnElement":true,"event":"custom","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false,"customEvent":"kiwi.modalHide"},
{"name":"Custom - kiwi.trackTrigger.page","trigger":[{"engine":"sc","command":"trackPageView","arguments":[{"customSetup":function(event,s){
/* global _satellite */
/**
* Created by jbeach on 2017-11-28
* Updated by jbeach on 2019-09-12
*/
kiwi = window.kiwi || {};
kiwi._thisPage = kiwi._thisPage || {};
kiwi._thisPage.siteSettings = kiwi._thisPage.siteSettings || {};
kiwi.appPageTrackCalls = kiwi.appPageTrackCalls || {};
kiwi.util = kiwi.util || {};
kiwi.util.getThisPageSettings = kiwi.util.getThisPageSettings || function() {_satellite.notify('Missing function: kiwi.util.getThisPageSettings()');return kiwi._thisPage;};
var ruleName='KIWI: EBR > Custom - kiwi.trackTrigger.page > Analytics';
//_satellite.notify(ruleName);
/*if (typeof kiwi._thisPage.siteSettings.appType !== 'undefined' && kiwi._thisPage.siteSettings.appType === 'spa-noroutes') {// this is handled on pushstate for apps that use meaningful urls
//protect against multiple app ready track calls
if (typeof kiwi.appPageTrackCalls.currentIncrement !=='undefined') {
kiwi.appPageTrackCalls.currentIncrement++;
_satellite.notify(ruleName + ' > appPageTrackCalls.currentIncrement: ' + kiwi.appPageTrackCalls.currentIncrement);
}
}*/
// reset everything as if new page
kiwi = window.kiwi || {};
kiwi.util = kiwi.util || {};
kiwi._elementToTest = '';
kiwi.domReady = kiwi.domReady || {};
kiwi.domReady.navs = true;
s.ActionDepthTest = true; //force increment Session Action Depth
_satellite.setVar('Derived Page Hash', '');
// set Kiwi _thisPage Values for new state
kiwi._thisPage = kiwi.util.getThisPageSettings();
//TODO: make this process better! maybe DCR called instead of DEC listen
// scrape/wire up dom
//var currIdx = cbTrackData.uiModsComplete || 0;
//cbTrackData.uiModsComplete = currIdx + 1;
//reset track triggers after page track
//kiwi.trackTriggersCleanSlate();
}}]}],"selector":"html","eventHandlerOnElement":true,"event":"custom","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false,"customEvent":"kiwi.trackTrigger.page"},
{"name":"Custom - kiwi.trackTrigger.widget","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Widgets Ready"}]}],"selector":"html","eventHandlerOnElement":true,"event":"custom","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false,"customEvent":"kiwi.trackTrigger.widget"},
{"name":"DEC - AppData UI Mods Complete","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-58a1bbe064746d201200663f.js"}]}]}],"event":"dataelementchange(AppData UI Mods Complete)","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"DEC - DDL Target Mods Complete","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-57ed1ea164746d28d0003b55.js"}]}]}],"event":"dataelementchange(DDL Target Mods Complete)","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"DEC - Target Mods Complete","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-59b189fa64746d520500591b.js"}]}]}],"event":"dataelementchange(Target Mods Complete)","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"DEC - Widget - DOP Profile - Kiwi Action","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Widget Display Change","customSetup":function(event,s){
/**
* Created by jbeach on 2018-06-06
* Updated by jbeach on 2018-06-13
*/
kiwi = window.kiwi || {};
kiwi.widgetInstances = kiwi.widgetInstances || {};
kiwi.widgetInstances.profile = kiwi.widgetInstances.profile || {};
kiwi.domReady = kiwi.domReady || {};
var ruleName='KIWI: DEC - Widget - DOP - Kiwi Action > Analytics - Widget Display Change';
//_satellite.notify(ruleName);
kiwi.domReady.navs = true;
/*_satellite.notify(ruleName + ': AFTER (Analytics) WIRE WIDGET' +
//'\n WidgetStatus = ' + widgetInstance.status.analytics +
'\n KiwiStatus = ' + kiwi.widgetInstances.profile.status +
'\n KiwiAction = ' + kiwi.widgetInstances.profile.action);
*/
}}]},{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5ab43fc164746d2458002e22.js"}]}]}],"conditions":[function(event,target){
/**
* Created by jbeach on 2018-03-20
* Updated by jbeach on 2018-06-13
*/
var ruleName='KIWI: DEC - Widget - DOP - Kiwi Action > Condition';
//_satellite.notify(ruleName);
kiwi = window.kiwi || {};
kiwi.widgetInstances = kiwi.widgetInstances || {};
kiwi.widgetInstances.profile = kiwi.widgetInstances.profile || {};
var cmet = false;
cmet = (kiwi.widgetInstances.profile.action === 'Track Link');
/*_satellite.notify(ruleName + ': ' +
//'\n WidgetStatus = ' + widgetInstance.status.analytics +
'\n KiwiStatus = ' + kiwi.widgetInstances.profile.status +
'\n KiwiAction = ' + kiwi.widgetInstances.profile.action);*/
return cmet;
}],"event":"dataelementchange(Widget - Profile - Kiwi Instance Action)","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"DEC - Widget - DOP Profile - Kiwi Status","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5ab4059464746d01bf008f81.js"}]}]}],"conditions":[function(event,target){
/**
* Created by jbeach on 2018-03-20
* Updated by jbeach on 2018-06-13
*/
var ruleName='KIWI: DEC - Widget - DOP - Kiwi Status > Condition';
//_satellite.notify(ruleName);
kiwi = window.kiwi || {};
kiwi.widgetInstances = kiwi.widgetInstances || {};
kiwi.widgetInstances.profile = kiwi.widgetInstances.profile || {};
var cmet = false;
cmet = (kiwi.widgetInstances.profile.status === 'Dynamic Mbox');
/*_satellite.notify(ruleName + ': ' +
//'\n WidgetStatus = ' + widgetInstanceStatusAnalytics +
'\n KiwiStatus = ' + kiwi.widgetInstances.profile.status +
'\n KiwiAction = ' + kiwi.widgetInstances.profile.action);*/
return cmet;
}],"event":"dataelementchange(Widget - Profile - Kiwi Instance Status)","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"DEC - Widget - DOP Profile - Widget Status","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5ab535bb64746d3db3004861.js"}]}]}],"conditions":[function(event,target){
/**
* Created by jbeach on 2018-03-20
* Updated by jbeach on 2018-09-28
*/
var ruleName='KIWI: DEC - Widget - DOP - Widget Status > Condition';
//_satellite.notify(ruleName);
var cmet = false,
widgetInstance = _satellite.getVar('Widget - Profile - Instance');
widgetInstance.status = widgetInstance.status || {};
widgetInstance.status.analytics = widgetInstance.status.analytics || '';
cmet = (widgetInstance.status.analytics === 'Polling' ||
widgetInstance.status.analytics === 'No Campaign' ||
widgetInstance.status.analytics === 'Timed Out' ||
widgetInstance.status.analytics === 'Intervention Set' ||
widgetInstance.status.analytics === 'College List Ready');
_satellite.notify(ruleName + ': ' +
'WidgetStatus = ' + widgetInstance.status.analytics);
return cmet;
}],"event":"dataelementchange(Widget - Profile - Status)","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"DEC - Widget - SSS Opt In - Kiwi Action","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Widget Display Change","customSetup":function(event,s){
/**
* Created by jbeach on 2018-06-13
* Updated by jbeach on 2018-06-13
*/
kiwi = window.kiwi || {};
kiwi.widgetInstances = kiwi.widgetInstances || {};
kiwi.widgetInstances.optin = kiwi.widgetInstances.optin || {};
kiwi.domReady = kiwi.domReady || {};
var ruleName='KIWI: DEC - Widget - SSS Opt In - Kiwi Action > Analytics';
//_satellite.notify(ruleName);
kiwi.domReady.navs = true;
/*_satellite.notify(ruleName + ': AFTER (Analytics) WIRE WIDGET' +
//'\n WidgetStatus = ' + widgetInstance.status.analytics +
'\n KiwiStatus = ' + kiwi.widgetInstances.optin.status +
'\n KiwiAction = ' + kiwi.widgetInstances.optin.action);
*/
}}]},{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5b21808864746d2991003cf4.js"}]}]}],"conditions":[function(event,target){
/**
* Created by jbeach on 2018-06-13
* Updated by jbeach on 2018-06-13
*/
var ruleName='KIWI: DEC - Widget - SSS Opt In - Kiwi Action > Condition';
//_satellite.notify(ruleName);
kiwi = window.kiwi || {};
kiwi.widgetInstances = kiwi.widgetInstances || {};
kiwi.widgetInstances.optin = kiwi.widgetInstances.optin || {};
var cmet = false;
cmet = (kiwi.widgetInstances.optin.action === 'Track Link');
_satellite.notify(ruleName + ': ' +
//'\n WidgetStatus = ' + widgetInstance.status.analytics +
'\n KiwiAction = ' + kiwi.widgetInstances.optin.action);
return cmet;
}],"event":"dataelementchange(Widget - SSS Opt In - Kiwi Instance Action)","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"DEC - Widget - SSS Opt In - Widget Status","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-59f23f6464746d55a10035d6.js"}]}]}],"conditions":[function(event,target){
/**
* Created by jbeach on 2018-06-13
* Updated by jbeach on 2018-06-13
*/
var ruleName='KIWI: DEC - Widget - SSS Opt In - Widget Status > Condition';
var cmet = false,
widgetInstance = _satellite.getVar('Widget - SSS Opt In - Instance');
widgetInstance.status = widgetInstance.status || {};
//widgetInstance.status.analytics = widgetInstance.status.analytics || '';
cmet = (widgetInstance.status === 'Done');
/*cmet = (widgetInstance.status.analytics === 'Polling' ||
widgetInstance.status.analytics === 'No Campaign' ||
widgetInstance.status.analytics === 'Timed Out' ||
widgetInstance.status.analytics === 'Intervention Set');*/
_satellite.notify(ruleName + ': ' +
'\n WidgetStatus = ' + widgetInstance.status.analytics);
return cmet;
}],"event":"dataelementchange(Widget - SSS Opt In - Status)","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"EE - Cookie Consent Banner","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5b0864ec64746d3c220022bd.js"}]}]}],"selector":"#optanon","event":"elementexists","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"EE - DDL Page Track Delay - SiteSearch","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-582fa60f64746d5570000d81.js"}]}]}],"scope":{"subdomains":{"include":[/^(www|www-dev|www-stg|widgetgallery\.nmd)\./i]}},"selector":"#sitesearch","event":"elementexists","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"Form Submit - Parent Opt In","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Parent Opt In Form Submit"}]},{"command":"delayActivateLink"}],"scope":{"subdomains":{"include":[/^(go|parents)\.collegeboard\.org$/i]}},"selector":"form#webform-client-form-226","event":"submit","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"HEDR - Data File - Download","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"HEDR - Data File - Download","customSetup":function(event,s){
var ruleName='KIWI: EBR > HEDR - Data File - Download > Analytics';
try {
kiwi._hedr_files_download = {
eventCodeA: '',
eventCodeB: '',
count: 1,
type: '',
delivMethod: '',
auditCount: 0,
};
if (event.detail) {
kiwi._hedr_files_download.eventCodeA = 'event218';
kiwi._hedr_files_download.eventCodeB = 'event219';
kiwi._hedr_files_download.count = event.detail.count || kiwi._hedr_files_download.count;
kiwi._hedr_files_download.type = event.detail.type || kiwi._hedr_files_download.type;
kiwi._hedr_files_download.delivMethod = event.detail.delivMethod || kiwi._hedr_files_download.delivMethod;
kiwi._hedr_files_download.auditCount = event.detail.auditCount || kiwi._hedr_files_download.auditCount;
} else {
_satellite.notify(ruleName+' ERROR: didn\'t capture data');
}
} catch (err) {
_satellite.notify(ruleName+' ERROR: ' + err.message);
}
}}]}],"selector":"html","eventHandlerOnElement":true,"event":"custom","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false,"customEvent":"html.hedr_files_download"},
{"name":"HEDR - FAS - Download","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"HEDR - FAS - Download","customSetup":function(event,s){
var ruleName='KIWI: EBR > HEDR - FAS - Download > Analytics';
try {
var eventCodeMap = {
'group-score': 'event213',
'indiv-score': 'event214',
'group-essay': 'event215',
'indiv-essay': 'event216'
},
eventMapText = '';
kiwi._hedr_fas_download = {
eventCode: '',
total: 1
};
if (event.detail) {
kiwi._hedr_fas_download.total = event.detail.count || kiwi._hedr_fas_download.total;
eventMapText = event.detail.source + '-' +event.detail.type;
kiwi._hedr_fas_download.eventCode = eventCodeMap[eventMapText] || kiwi._hedr_fas_download.eventCode;
} else {
_satellite.notify(ruleName+' ERROR: didn\'t capture data');
}
} catch (err) {
_satellite.notify(ruleName+' ERROR: ' + err.message);
}
}}]}],"selector":"html","eventHandlerOnElement":true,"event":"custom","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false,"customEvent":"html.hedr_fas_download"},
{"name":"HEDR - Report View","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"HEDR - Report View","customSetup":function(event,s){
var ruleName='KIWI: EBR > HEDR - Report View > Analytics';
try {
kiwi._hedr_report_view = {
eventCode: '',
report: '',
source: '',
sy: '',
type: ''
};
if (event.detail) {
kiwi._hedr_report_view.eventCode = 'event217';
kiwi._hedr_report_view.report = event.detail.report || kiwi._hedr_report_view.report;
kiwi._hedr_report_view.source = event.detail.source || kiwi._hedr_report_view.source;
kiwi._hedr_report_view.sy = event.detail.sy || kiwi._hedr_report_view.sy;
kiwi._hedr_report_view.type = event.detail.type || kiwi._hedr_report_view.type;
} else {
_satellite.notify(ruleName+' ERROR: didn\'t capture data');
}
} catch (err) {
_satellite.notify(ruleName+' ERROR: ' + err.message);
}
}}]}],"selector":"html","eventHandlerOnElement":true,"event":"custom","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false,"customEvent":"html.hedr_report_view"},
{"name":"PushState or Hashchange Track 2","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5c77ee3464746d0bdc002cf5.js"}]}]}],"conditions":[function(event,target){
/**
* Created by jbeach on 2018-09-19
* Updated by jbeach on 2019-09-16
*/
kiwi = window.kiwi || {};
kiwi._thisPage = kiwi._thisPage || {};
kiwi.util = kiwi.util || {};
kiwi.util.getThisPageSettings = kiwi.util.getThisPageSettings || function() {_satellite.notify('Missing function: kiwi.util.getThisPageSettings()');return kiwi._thisPage;};
var ruleName='KIWI: EBR > Push State or Hash Change - Page Track 2 > Condition JS';
_satellite.notify(ruleName);
// set Kiwi _thisPage Values for new state
kiwi._thisPage = kiwi.util.getThisPageSettings();
//Analytics Ready Event JS (For SPAs so that view is in DOM before tracking/wiring, and preventing double tracking)
/*if (kiwi._thisPage.siteSettings.appType.match(/^spa-/i)) {
kiwi._suppressTrack = true;
_satellite.notify(ruleName + ' > Analytics Ready Event JS');
// aa-side clean slate
kiwi.pageTrackTriggers.aa = false;
// send an event that aa is ready to track
document.dispatchEvent(new CustomEvent('kiwi.ready.aa', {'bubbles': true}));
if(kiwi._thisPage.siteCode === 'bfm') _satellite.track('cbTrack.pageView.bfm');
}*/
// send an event that route is ready to track
document.dispatchEvent(new CustomEvent('kiwi.ready.route', {'bubbles': true}));
return true;
}],"event":"locationchange","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false},
{"name":"Select Change - Widget","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Feature Used - Widget","customSetup":function(event,s){
/**
* Created by jbeach on 2019-05-19
* Updated by jbeach on 2019-05-19
*/
kiwi = window.kiwi || {};
var ruleName='KIWI: EBR > Select Change - Widget > Analytics JS';
_satellite.notify(ruleName);
kiwi._elementToTest = this;
}}]}],"selector":"[data-cbtrack-widget] select[data-cbtrack-linktype]","eventHandlerOnElement":true,"event":"change","bubbleFireIfParent":true,"bubbleFireIfChildFired":true,"bubbleStop":false}
],
"directCallRules": [
{"name":"cbTrack.customEvent","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-58c6c93e64746d4826004263.js"}]}]}]},
{"name":"cbTrack.customEvent.track","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"%Custom Event Name%","customSetup":function(event,s){
/**
* Created by jbeach on 2017-03-06
* Updated by jbeach on 2017-10-30
*/
var ruleName='KIWI: DCR > 00 Master > Custom Event Track > Analytics';
_satellite.notify(ruleName);
}}]}]},
{"name":"cbTrack.featureUsed","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Feature Used - %Site Code%","customSetup":function(event,s){
/**
* Created by jbeach on 2017-02-14
* Updated by jbeach on 2017-10-30
*/
var ruleName='KIWI: Rule > Direct Call > 00 Master > Feature Used > Analytics JS';
_satellite.notify(ruleName);
}}]}]},
{"name":"handleLegacy.sCode.t","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-58dbb78f64746d482900c5ae.js"}]}]}]},
{"name":"handleLegacy.sCode.tl","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-58fa82e264746d07dd0094c5.js"}]}]}]},
{"name":"cbTrack.legacy.ajaxError","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"ajax error tracking","customSetup":function(event,s){
/**
* Created by jbeach on 2017-03-14
* Updated by jbeach on 2017-05-09
*/
var ruleName='KIWI: DCR > 00 Master > Track > Legacy Ajax Error - Analytics JS';
_satellite.notify(ruleName);
s.linkTrackVars=s.apl(s.linkTrackVars, 'prop11,prop12,prop13', ',', 2);
}}]}]},
{"name":"cbTrack.linkTrack","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Link Track - %Site Code%","customSetup":function(event,s){
/**
* Created by jbeach on 2017-12-21
*/
var ruleName='KIWI: Rule > Direct Call > 00 Master > Link Track > Analytics JS';
_satellite.notify(ruleName);
}}]}]},
{"name":"cbTrack.pageView","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-589b5cf364746d2ae8005489.js"}]}]}]},
{"name":"cbTrack.search","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Search - %Site Code%","customSetup":function(event,s){
/**
* Created by jbeach on 2017-11-28.
*/
var ruleName='KIWI: Rule > Direct Call > 00 Master > Search > Analytics JS';
_satellite.notify(ruleName);
}}]}]},
{"name":"cbTrack.accuprac.testReg","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Accuplacer Practice - Test Registration","customSetup":function(event,s){
/**
* Created by jbeach on 2017-05-17
*/
/* from application
var uniqueUserId = [from server];
var appTypes = {"231":"ESL","232":"Next-Generation Practice Tests","233":"Classic Practice Tests","234":"Texas Success Initiative (TSI) Practice Tests","235":"North Carolina Community College System (NCCCS) Practice","236":"Ivy Tech Community College of Indiana Practice"};
var selectedType = $("input:radio[name=appId]:checked").val();
var selectedTestTypeValue = appTypes[selectedType]; //e.g. Next Gen, TSI, Ivy Tech, NC, National
window.cbTrackData = window.cbTrackData || {};
cbTrackData.accupracUserId = uniqueUserId;
cbTrackData.accupracRegType = selectedTestTypeValue; */
s.linkTrackVars=s.apl(s.linkTrackVars, 'events,eVar33', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event94', ',', 2);
}}]}]},
{"name":"cbTrack.testConversion","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Fake Conversion"}]}]},
{"name":"cbTrack.appError","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Application Error"}]}]},
{"name":"cbTrack.bf.actionPlanGradeSelect","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"BF: Action Plan Grade Select","customSetup":function(event,s){
/**
* Created by jbeach on 2017-03-14
* Updated by jbeach on 2017-10-30
*/
var ruleName='KIWI: DCR > Big Future > Action Plan Grade Select - Analytics';
_satellite.notify(ruleName);
}}]}]},
{"name":"cbTrack.bf.collegeListAdd","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5d449b4064746d25bd0002f0.js"}]}]}]},
{"name":"cbTrack.rmsCollegesFilter","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5d7a809864746d1acf001793.js"}]}]}]},
{"name":"cbTrack.bfm.collegeListAdd","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5d459ed064746d74c00003f8.js"}]}]}]},
{"name":"cbTrack.cbosCollegeApply","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"CBOS - Colleges Apply"}]}]},
{"name":"cbTrack.cbosFafsaConfirm","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"CBOS - FAFSA Confirm"}]}]},
{"name":"cbTrack.cbosLowIncomeOptIn","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"CBOS - Low Income Opt In"}]}]},
{"name":"cbTrack.cbosLowIncomeOptOut","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"CBOS - Low Income Opt Out"}]}]},
{"name":"cbTrack.click.dynamicDownloadLink","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Dynamic Download Link"}]}]},
{"name":"cbTrack.click.promo.ssr","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Promo Link","customSetup":function(event,s){
/**
* Created by jbeach on 2017-01-31
* Updated by jbeach on 2017-10-26
*/
var ruleName='KIWI: DCR > Click - Promo - SSR > Analytics';
_satellite.notify(ruleName);
//_satellite.setVar('Async Promo Link Fired','anyval');
}}]}]},
{"name":"cbTrack.click.promoLink","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Promo Link"}]}]},
{"name":"cbTrack.click.promoLink.getsitecontrol","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Promo Click getsitecontrol"}]}]},
{"name":"cbTrack.customEvent.bf","trigger":[{"command":"loadScript","arguments":[{"sequential":true,"scripts":[{"src":"satellite-58bde09b64746d2cd30001ee.js"}]}]}]},
{"name":"cbTrack.featureUsed.bf","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-58bddf1664746d482c0000ef.js"}]}]}]},
{"name":"cbTrack.featureUsed.flipbook","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-57ff9dff64746d7ddd0029b4.js"}]}]}]},
{"name":"cbTrack.featureUsed.hedreports","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-57d1691b64746d4d4100b0a5.js"}]}]}]},
{"name":"cbTrack.featureUsed.target","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Target Link Click"}]}]},
{"name":"cbTrack.featureUsed.apdp","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-57fea82464746d38fe00264b.js"}]}]}]},
{"name":"cbTrack.featureUsed.bfm","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-574f476764746d633300075a.js"}]}]}]},
{"name":"cbTrack.featureUsed.k12r","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-58a346ef64746d1163009a08.js"}]}]}]},
{"name":"cbTrack.featureUsed.storyline","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Feature Action - Storyline"}]}]},
{"name":"cbTrack.iam.approveAccountLink","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Approve Account Link","customSetup":function(event,s){
/**
* Created by jbeach on 2017-06-26
* Updated by jbeach on 2018-03-12
*/
/*
from application
function postResponse(approvalState) {
if (clickedOnce == 1) return false;
clickedOnce = 1;
try {
if(approvalState == 'allow') {
if(typeof _satellite != 'undefined') {
_satellite.track('cbTrack.iam.approveAccountLink');
}
}
}
catch(e) {
//Do nothing move forward with submit
}
document.forms[0]['pf.oauth.authz.consent'].value=approvalState;
document.forms[0].submit();
}
*/
}}]}]},
{"name":"cbTrack.collegeAdd","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"College Add"}]}]},
{"name":"cbTrack.rmsScoreChange","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"RMS Score Change"}]}]},
{"name":"kiwi.pageView","trigger":[{"engine":"sc","command":"trackPageView","arguments":[{"customSetup":function(event,s){
/**
* Created by jbeach on 2019-09-19
* Updated by jbeach on 2019-09-19
*/
kiwi = window.kiwi || {};
kiwi.pageTrack = kiwi.pageTrack || {};
kiwi.pageTrack.arrStack = kiwi.pageTrack.arrStack || [];
var ruleName='DCR > Kiwi - Page View - Analytics JS';
//_satellite.notify(ruleName);
kiwi.pageTrack.arrStack.push({pageName: _satellite.getVar('Page Name'), source: 'dcr-kiwipageview'});
_satellite.notify('KIWI LISTENER: DCR > Kiwi - Page View called page track. kiwi.ddl.page: '+JSON.stringify(kiwi.ddl.page));
kiwi.pageTrack.intercept = true;
}}]}]},
{"name":"cbTrack.legacySupport.click.navLink","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"%Nav Link%","customSetup":function(event,s){
/**
* Created by jbeach on 2016-12-01
* Updated by jbeach on 2017-11-16
*/
var ruleName='KIWI: DCR > Legacy Support > Click > Nav Link > Analytics';
_satellite.notify(ruleName);
s.linkTrackVars=s.apl(s.linkTrackVars, 'events,eVar76', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event95', ',', 2);
}}]}]},
{"name":"cbTrack.click.legacyAdcodeLink","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Ad Link to Legacy: %Ad Link%","customSetup":function(event,s){
/**
* Created by jbeach on 2016-12-01
* Updated by jbeach on 2017-05-09
*/
var ruleName='KIWI: DCR > Legacy Support > Click > Promo Link > Analytics';
_satellite.notify(ruleName);
s.linkTrackVars=s.apl(s.linkTrackVars, 'events,eVar2', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event13', ',', 2);
}}]}]},
{"name":"cbTrack.linkTrack.apfym","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5a3c3aae64746d476b018ec6.js"}]}]}]},
{"name":"cbTrack.pageView.apsupport","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5d8391d164746d1e5c000441.js"}]}]}]},
{"name":"cbTrack.pageView.apc","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5ab94f7364746d4a02001fdf.js"}]}]}]},
{"name":"cbTrack.pageView.hedreports","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-57d1649964746d361f00ce4d.js"}]}]}]},
{"name":"cbTrack.pageView.nsat","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-587e69fe64746d47ca00a634.js"}]}]}]},
{"name":"cbTrack.pageView.profile","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-599adbc164746d7ae4001178.js"}]}]}]},
{"name":"cbTrack.pageView.widget","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-58f4c5e164746d1908005e8c.js"}]}]}]},
{"name":"cbTrack.pageView.apdp","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-57fea82464746d38fe002639.js"}]}]}]},
{"name":"cbTrack.pageView.apfym","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-59c0096864746d383200a02f.js"}]}]}]},
{"name":"cbTrack.pageView.apinsight","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-59b817db64746d08f200ac29.js"}]}]}]},
{"name":"cbTrack.pageView.bfm","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-58d406be64746d482600a008.js"}]}]}]},
{"name":"cbTrack.pageView.iam","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5a5e2a5864746d77280006b6.js"}]}]}]},
{"name":"cbTrack.pageView.k12r","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-58c9819364746d2cd300745e.js"}]}]}]},
{"name":"cbTrack.pageView.pps","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5ad639fa64746d03550069ac.js"}]}]}]},
{"name":"cbTrack.pageView.siteSearch.error","trigger":[{"engine":"sc","command":"trackPageView","arguments":[{"customSetup":function(event,s){
/**
* Created by jbeach on 2016-11-18
* Updated by jbeach on 2019-09-19
*/
kiwi = window.kiwi || {};
kiwi.pageTrack = kiwi.pageTrack || {};
kiwi.pageTrack.arrStack = kiwi.pageTrack.arrStack || [];
var ruleName='DCR > Page View - sitesearch - Load Error - Analytics JS';
//_satellite.notify(ruleName);
_satellite.setVar('Page Name Override', 'sitesearch/loaderror');
kiwi.pageTrack.arrStack.push({pageName: _satellite.getVar('Page Name'), source: 'dcr-sitesearchloaderror'});
_satellite.notify('KIWI LISTENER: DCR > Page View - sitesearch - Load Error called page track. kiwi.ddl.page: '+JSON.stringify(kiwi.ddl.page));
kiwi.pageTrack.intercept = true;
}}]}]},
{"name":"cbTrack.pageView.siteSearch.loaded","trigger":[{"engine":"sc","command":"trackPageView","arguments":[{"customSetup":function(event,s){
/**
* Speed tracking harvested from Adobe's s_getLoadTime v1.36
* Created by jbeach on 2016-11-18
* Updated by jbeach on 2019-09-19
*/
digitalData = window.digitalData || {};
digitalData.page = digitalData.page || {};
digitalData.page.pageInfo = digitalData.page.pageInfo || {};
kiwi = window.kiwi || {};
kiwi.pageTrack = kiwi.pageTrack || {};
kiwi.pageTrack.arrStack = kiwi.pageTrack.arrStack || [];
cbTrackData = window.cbTrackData || {
searchType: '',
searchTerm: '',
searchResultsCount: ''
};
var ruleName='DCR > Page View - sitesearch - Loaded > Analytics JS';
_satellite.notify(ruleName);
/* PageName + Search Data Vars */
digitalData.page.pageInfo.pageName = 'sitesearch/searchresults';
digitalData.page.pageInfo.onsiteSearchType = cbTrackData.searchType;
digitalData.page.pageInfo.onsiteSearchTerm = cbTrackData.searchTerm;
digitalData.page.pageInfo.onsiteSearchResult = cbTrackData.searchResultsCount;
if (digitalData.page.pageInfo.onsiteSearchResult === '0') digitalData.page.pageInfo.pageName = 'sitesearch/noresults';
/* end PageName + Search Data Vars */
/* Site Search Speed */
var startTime = kiwi._siteSearchEventStart,
endTime = new Date().getTime(),
siteSearchSpeed = startTime?Math.round((endTime-startTime)/100):'';
_satellite.setVar('Site Search Speed', siteSearchSpeed);
kiwi.pageTrack.arrStack.push({pageName: _satellite.getVar('Page Name'), source: 'dcr-sitesearchloaded'});
_satellite.notify('KIWI LISTENER: DCR > Page View - sitesearch - Loaded called page track. kiwi.ddl.page: '+JSON.stringify(kiwi.ddl.page));
kiwi.pageTrack.intercept = true;
/* end Site Search Speed */
}}]}]},
{"name":"cbTrack.pageView.siteSearch.loading","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5894a7ee64746d1493000ec9.js"}]}]}]},
{"name":"cbTrack.pageView.ssr","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-588f8a4264746d5045000610.js"}]}]}]},
{"name":"cbTrack.pageView.storyline","trigger":[{"engine":"sc","command":"trackPageView","arguments":[{"customSetup":function(event,s){
/**
* Created by jbeach on 2019-01-25
* Updated by jbeach on 2019-09-19
*/
kiwi = window.kiwi || {};
kiwi.util = kiwi.util || {};
kiwi.util.sanitizeString = kiwi.util.sanitizeString || function() {_satellite.notify('Missing function: kiwi.util.sanitizeString!');};
kiwi.pageTrack = kiwi.pageTrack || {};
kiwi.pageTrack.arrStack = kiwi.pageTrack.arrStack || [];
cbTrackData = window.cbTrackData || {};
//var ruleName='KIWI: DCR > Page View - storyline > Analytics';
//_satellite.notify(ruleName);
var customPageName = 'storyline:';
if (cbTrackData.pageCode) customPageName += kiwi.util.sanitizeString(cbTrackData.pageCode);
_satellite.setVar('Page Name Override', customPageName);
kiwi.pageTrack.arrStack.push({pageName: _satellite.getVar('Page Name'), source: 'dcr-storyline'});
_satellite.notify('KIWI LISTENER: DCR > Page View - storyline called page track. kiwi.ddl.page: '+JSON.stringify(kiwi.ddl.page));
kiwi.pageTrack.intercept = true;
}}]}]},
{"name":"cbTrack.popoverAutoShown","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5dc43c5c64746d28cb000dcc.js"}]}]}]},
{"name":"cbTrack.popoverCarouselShifted","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5dc1cef664746d159a000c62.js"}]}]}]},
{"name":"cbTrack.reportLoad.complete.k12r","trigger":[{"engine":"sc","command":"trackPageView","arguments":[{"customSetup":function(event,s){
/**
* Created by jbeach on 2017-02-14
* Updated by jbeach on 2019-09-19
*/
kiwi = window.kiwi || {};
kiwi.pageTrack = kiwi.pageTrack || {};
kiwi.pageTrack.arrStack = kiwi.pageTrack.arrStack || [];
var ruleName='DCR > Report Load - Complete > Analytics JS';
_satellite.notify(ruleName);
kiwi.pageTrack.arrStack.push({pageName: _satellite.getVar('Page Name'), source: 'dcr-reportloadcomplete'});
_satellite.notify('KIWI LISTENER: DCR > Report Load - Complete called page track. kiwi.ddl.page: '+JSON.stringify(kiwi.ddl.page));
kiwi.pageTrack.intercept = true;
_satellite.setVar('Report Load Complete', true);
/* Report Load Speed */
var startTime = kiwi._reportLoadEventStart,
endTime = new Date().getTime(),
speed = startTime?Math.round((endTime-startTime)/100):'';
_satellite.setVar('Report Load Speed', speed);
/* end Report Load Speed */
}}]}]},
{"name":"cbTrack.reportLoad.partial.k12r","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Report Load - Partial - K12R","customSetup":function(event,s){
/**
* Created by jbeach on 2017-02-14
* Updated by jbeach on 2017-05-09
*/
var ruleName='KIWI: DCR > Report Load > Partial - Analytics JS';
_satellite.notify(ruleName);
s.linkTrackVars=s.apl(s.linkTrackVars, 'events,prop43,eVar74', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event100', ',', 2);
_satellite.setVar('Report Load Partial', true);
}}]}]},
{"name":"cbTrack.reportLoad.start.k12r","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"Report Load - Start - K12R","customSetup":function(event,s){
/**
* Created by jbeach on 2017-02-14
* Updated by jbeach on 2018-01-19
*/
kiwi = window.kiwi || {};
var ruleName='KIWI: DCR > Report Load - Start > Analytics JS';
_satellite.notify(ruleName);
kiwi._reportLoadEventStart = new Date().getTime();
s.linkTrackVars=s.apl(s.linkTrackVars, 'events,prop43,eVar74', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event89', ',', 2);
_satellite.setVar('Report Load Start', true);
}}]}]},
{"name":"sfmcPollResponse.apExamIntent","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"AP Exam Intent Form Submit"}]}]},
{"name":"cbTrack.deployUx","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5c33c30364746d408b01cd6e.js"}]}]}]},
{"name":"cbTrack.viewInDom","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5bf55e8b64746d516c0053cd.js"}]}]}]},
{"name":"cbTrack.springBoardDigital.assignmentMade","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"SpringBoard Digital - Assignment Made","setVars":{"eVar71":"%AppData Assignment Type%"},"addEvent":["event84"]}]}]},
{"name":"cbTrack.springBoardDigital.lessonPlanMade","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"SpringBoard Digital - Lesson Plan Made","addEvent":["event85"]}]}]},
{"name":"cbTrack.trigger.downloadLink","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"d","linkName":"Triggered Download Link"}]}]},
{"name":"cbTrack.widgetsReady","trigger":[{"command":"loadScript","arguments":[{"sequential":false,"scripts":[{"src":"satellite-5d238aa664746d3de400403e.js"}]}]}]},
{"name":"cbTrack.modalView","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"cbTrack.modalView"}]}]},
{"name":"cbTrack.sssOptOut","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"cbTrack.sssOptOut"}]}]},
{"name":"cbTrack.sssOptin","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"cbTrack.sssOptin"}]}]},
{"name":"cbTrack.sssOptout","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"cbTrack.sssOptout"}]}]},
{"name":"cbTrack.sssReOptin","trigger":[{"engine":"sc","command":"trackLink","arguments":[{"type":"o","linkName":"cbTrack.sssReOptin"}]}]}
],
"settings": {
"trackInternalLinks": true,
"libraryName": "satelliteLib-0397ae4916dd85521cee60125d909021a2f2d335",
"isStaging": false,
"allowGATTcalls": false,
"downloadExtensions": /\.(?:doc|docx|eps|jpg|png|svg|xls|ppt|pptx|pdf|xlsx|tab|csv|zip|txt|vsd|vxd|xml|js|css|rar|exe|wma|mov|avi|wmv|mp3|wav|m4v)($|\&|\?)/i,
"notifications": false,
"utilVisible": false,
"domainList": [
"academicmerit.com",
"acquia-sites.com",
"apscore.org",
"cbapis.org",
"collegeboard.com",
"collegeboard.org",
"flossyourscore.com",
"springboardonline.com",
"springboardonline.org"
],
"scriptDir": "7a8a98de0363fbed05b98da851d6b23866ffa7cc/scripts/",
"tagTimeout": 3000
},
"data": {
"URI":
document.location.pathname + document.location.search
,
"browser": {
},
"cartItems": [
],
"revenue": "",
"host": {
"http": "assets.adobedtm.com",
"https": "assets.adobedtm.com"
}
},
"dataElements": {
"AA - Application Error": {"customJS":function(){
/**
* Created by jbeach on 2019-09-11
* Updated by jbeach on 2019-09-11
*/
//var ruleName='KIWI: Data Element > AA - Application Error';
var ddlVal = _satellite.getVar('DDL - App Error'),
statusCode = '',
errorMessage = '',
val = '';
if (ddlVal) {
statusCode = ddlVal.code;
errorMessage = ddlVal.message;
}
val = statusCode+':'+errorMessage;
return val;
},"storeLength":"pageview","cleanText":true},
"AA - SAT Fee Waiver Type": {"customJS":function(){
/**
* Created by jbeach on 2019-02-19
* Updated by jbeach on 2019-02-21
*/
//var ruleName='KIWI: Data Element > AA - SAT Fee Waiver Type';
var ddlVal = _satellite.getVar('DDL - SatReg - FeeWaiver'),
ddlValueMap = {
'none' : 'No Fee Waiver',
'coupon' : 'Coupon Waiver',
'benefit' : 'Benefit Waiver'
},
val = '';
if (ddlValueMap[ddlVal]) val = ddlValueMap[ddlVal];
if (val.length === 0 && ddlVal.length > 0) {
val = 'DDL Value: ' + ddlVal;
}
return val;
},"storeLength":"pageview"},
"AppData Action Code": {"jsVariable":"cbTrackData.actionCode","storeLength":"pageview"},
"AppData AP Course Enrollment": {"jsVariable":"cbTrackData.apCourseEnrollment","storeLength":"pageview"},
"AppData AP Course ID": {"jsVariable":"cbTrackData.apCourseId","storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"AppData AP Exam Registration": {"jsVariable":"cbTrackData.apExamRegistration","storeLength":"pageview"},
"AppData App ID": {"customJS":function(){
cbTrackData = window.cbTrackData || {};
kiwi = window.kiwi || {};
kiwi.ddl = kiwi.ddl || {};
var val = '';
val = kiwi.ddl.appId;
if (!val && cbTrackData.appId) val = cbTrackData.appId;
return val;
},"storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"AppData App Pilot": {"customJS":function(){
/**
* Created by jbeach on 2017-12-18
* Updated by jbeach on 2018-01-22
*/
cbTrackData = window.cbTrackData || {};
var ruleName='KIWI: Data Element > AppData App Pilot';
val = '';
if(cbTrackData.pilot) {
val = cbTrackData.pilot;
} else if (cbTrackData.apPilot) {
val = cbTrackData.apPilot;
}
//if (val) _satellite.notify(ruleName+': ('+valSrc+') '+ val);
return val;
},"storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"AppData App User Org ID": {"customJS":function(){
/**
* Created by jbeach on 2017-12-18
* Updated by jbeach on 2018-12-29
*/
cbTrackData = window.cbTrackData || {};
digitalData = window.digitalData || {};
digitalData.user = digitalData.user || [];
//var ruleName='KIWI: Data Element > AppData App User Org ID';
var val = '';
if(cbTrackData.appUserOrgId) {
val = cbTrackData.appUserOrgId;
} else if (cbTrackData.userApOrgId) {
val = cbTrackData.userApOrgId;
}
//apStudentOrgId overrides other settings
if (cbTrackData.apStudentOrgId) {
val = cbTrackData.apStudentOrgId;
}
if (!val &&
digitalData.user[0] &&
digitalData.user[0].diCode) {
val = digitalData.user[0].diCode; //HEDR TODO: deprecate this schema and update HEDR app to new one
}
//if (val) _satellite.notify(ruleName+': ('+valSrc+') '+ val);
return val;
},"storeLength":"pageview","cleanText":true},
"AppData AP Student Grade Level": {"jsVariable":"cbTrackData.apStudentGradeLevel","storeLength":"pageview","cleanText":true},
"AppData AP Student ID": {"jsVariable":"cbTrackData.apStudentId","storeLength":"pageview","cleanText":true},
"AppData AP Student Registration": {"jsVariable":"cbTrackData.apRegistration","storeLength":"pageview"},
"AppData Assignment Type": {"jsVariable":"cbTrackData.assignmentType","storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"AppData College List Add Method": {"jsVariable":"cbTrackData.collegeListAddMethod","storeLength":"pageview"},
"AppData Custom Event Array": {"jsVariable":"cbTrackData.arrCustomEvent","storeLength":"pageview"},
"AppData DI Code": {"customJS":function(){
kiwi = window.kiwi || {};
var val = '';
//if there is a kiwi.ddl.user.diCode - use it, e.g. HEDR Users
if (!val &&
kiwi.ddl &&
kiwi.ddl.user &&
kiwi.ddl.user.diCode) {
val = kiwi.ddl.user.diCode;
}
//if there is a kiwi.ddl.page.diCode - use it, e.g. NSAT Score Sends (score choice by di)
if (!val &&
kiwi.ddl &&
kiwi.ddl.page &&
kiwi.ddl.page.diCode) {
val = kiwi.ddl.page.diCode;
}
return val;
},"storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"AppData Error Code": {"customJS":function(){
cbTrackData = window.cbTrackData || {};
kiwi = window.kiwi || {};
kiwi.ddl = kiwi.ddl || {};
kiwi.ddl.page = kiwi.ddl.page || {};
var val = '';
val = kiwi.ddl.page.errorCode;
if (!val && cbTrackData.errorCode) val = cbTrackData.errorCode;
return val;
},"storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"AppData Feature Used": {"customJS":function(){
/**
* Created by jbeach on 2017-01-22
* Updated by jbeach on 2018-01-22
*/
cbTrackData = window.cbTrackData || {};
var ruleName='KIWI: Data Element > AppData Feature Used';
val = '';
if(cbTrackData.featureUsed) {
val = cbTrackData.featureUsed;
} else if (cbTrackData.user &&
cbTrackData.user.featureUsed) { //legacy DDL settings by BF Mobile
val = cbTrackData.user.featureUsed;
val = val.replace(/^(bfm\:)/gi, '');
}
//if (val) _satellite.notify(ruleName+': ('+valSrc+') '+ val);
return val;
},"storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"AppData Flow Code": {"customJS":function(){
cbTrackData = window.cbTrackData || {};
kiwi = window.kiwi || {};
kiwi.ddl = kiwi.ddl || {};
kiwi.ddl.page = kiwi.ddl.page || {};
var val = '';
val = kiwi.ddl.page.flowCode;
if (!val && cbTrackData.flowCode) val = cbTrackData.flowCode;
return val;
},"storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"AppData Flow Steps": {"jsVariable":"cbTrackData.flowSteps","storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"AppData Local Nav Item Clicked": {"jsVariable":"cbTrackData.localNavItemClicked","storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"AppData NPC School ID": {"jsVariable":"cbTrackData.npcSchoolId","storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"AppData Page Code": {"customJS":function(){
/**
* Created by jbeach on 2017-01-17
* Updated by jbeach on 2019-04-19
*/
cbTrackData = window.cbTrackData || {};
kiwi = window.kiwi || {};
kiwi.ddl = kiwi.ddl || {};
kiwi.ddl.page = kiwi.ddl.page || {};
//var ruleName='KIWI: Data Element > AppData Page Code',
// valSrc = '';
var val = '';
val = kiwi.ddl.page.pageCode;
if (!val && cbTrackData.pageCode) val = cbTrackData.pageCode;
//if (val) _satellite.notify(ruleName+': ('+valSrc+') '+ val);
return val;
},"storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"AppData Page Name": {"customJS":function(){
/**
* Created by jbeach on 2017-05-04
* Updated by jbeach on 2018-01-19
*/
//var ruleName='KIWI: Data Element > AppData Page Name',
// valSrc = '';
var val = '',
valSep = ':',
appDataPageCode = _satellite.getVar('AppData Page Code');
if (appDataPageCode) {
val = _satellite.getVar('Site Code') + valSep + appDataPageCode;
}
//if (val) _satellite.notify(ruleName+': ('+valSrc+') '+ val);
return val;
},"storeLength":"pageview"},
"AppData Page View State": {"customJS":function(){
var val = '',
pvsEl = document.querySelector('[data-cbtrack-viewstate]');
if (pvsEl) {
val = pvsEl.getAttribute('data-cbtrack-viewstate');
}
return val;
},"storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"AppData Promo Clicked": {"jsVariable":"cbTrackData.promoClicked","storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"AppData Promos Viewed": {"jsVariable":"cbTrackData.promosViewed","storeLength":"pageview"},
"AppData PSAT Score Viewed": {"customJS":function(){
/**
* Created by jbeach on 2018-05-18
* Updated by jbeach on 2018-05-18
*/
cbTrackData = window.cbTrackData || {};
var ruleName='KIWI: Data Element > AppData PSAT Score Viewed';
val = '';
if(cbTrackData.svP) {
val = cbTrackData.svP;
} else if (cbTrackData.psatScoreViewed) {
val = cbTrackData.psatScoreViewed;
}
//if (val) _satellite.notify(ruleName+': ('+valSrc+') '+ val);
return val;
},"storeLength":"pageview"},
"AppData SAT Reg Number": {"jsVariable":"cbTrackData.satRegNo","storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"AppData SAT Score View": {"customJS":function(){
/**
* Created by jbeach on 2018-05-18
* Updated by jbeach on 2018-12-26
*/
cbTrackData = window.cbTrackData || {};
//var ruleName='KIWI: Data Element > AppData SAT Score View';
var val = '';
if(cbTrackData.svS) {
val = cbTrackData.svS;
} else if (cbTrackData.satScoreViewed) {
val = cbTrackData.satScoreViewed;
}
//if (val) _satellite.notify(ruleName+': ('+valSrc+') '+ val);
return val;
},"storeLength":"pageview"},
"AppData Score Status": {"jsVariable":"cbTrackData.scoreStatus","storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"AppData Site Code": {"customJS":function(){
/**
* Created by jbeach on 2017-01-27
* Updated by jbeach on 2018-01-22
*/
cbTrackData = window.cbTrackData || {};
var ruleName='KIWI: Data Element > AppData Site Code';
var val = '',
valSrc = '';
if(cbTrackData.siteCode) {
val = cbTrackData.siteCode;
valSrc = 'AppData.siteCode';
} else if (cbTrackData.appCode) {
val = cbTrackData.appCode;
valSrc = 'AppData.appCode';
}
//if (val) _satellite.notify(ruleName+': ('+valSrc+') '+ val);
return val;
},"storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"AppData Test Order": {"jsVariable":"cbTrackData.testOrder","storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"AppData Track Delay Type": {"jsVariable":"cbTrackData.trackDelayType","storeLength":"pageview"},
"AppData UI Mods Complete": {"jsVariable":"cbTrackData.uiModsComplete","storeLength":"pageview"},
"AppData User District": {"jsVariable":"cbTrackData.userDistrict","storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"AppData User Type": {"jsVariable":"cbTrackData.userType","storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"AppData Widgets": {"jsVariable":"cbTrackData.atlas","storeLength":"pageview"},
"Apple Device Screen Size": {"customJS":function(){
if ((navigator.userAgent.indexOf('iPhone') > -1) || (navigator.userAgent.indexOf('iPad') > -1)) {
return 'D=s' //screen.width + 'x' + screen.height;
} else {return ''}
},"storeLength":"pageview"},
"Apricot - User Input Method": {"customJS":function(){
/* global cb */
/**
* Created by jbeach on 2019-05-30
* Updated by jbeach on 2019-05-30
*/
//var ruleName='KIWI: Data Element > Apricot - User Input Method';
var val = '';
if (typeof cb != 'undefined' &&
typeof cb.apricot !== 'undefined' &&
typeof cb.apricot.inputMethod !== 'undefined' &&
typeof cb.apricot.inputMethod.input !== 'undefined') {
val = cb.apricot.inputMethod.input();
}
if (!val) val = 'not-detected';
//if (val) _satellite.notify(ruleName+': ('+valSrc+') '+ val);
return val;
},"storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"Apricot Version": {"customJS":function(){
/* global cb */
/**
* Created by jbeach on 2017-07-13
* Updated by jbeach on 2019-04-05
*/
//var ruleName='KIWI: Data Element > Apricot Version';
var val = '',
x = null,
re = null,
ref = null,
i = 0;
if (typeof cb != 'undefined' &&
typeof cb.apricot != 'undefined' &&
typeof cb.apricot.version != 'undefined') {
val = 'apricot-' + cb.apricot.version;
}
if (!val) {
x = document.getElementsByTagName('link');
re = /\/\/mango\.collegeboard\.org\/cbmango1\/prod\/apricot\/all\/\d+\/(.*)\.css/i;
for (i = 0; i < x.length; i++) {
ref = x[i].href;
if(ref.match(re)) val = re.exec(ref)[1];
}
}
if (!val) {
x = document.scripts;
re = /\/\/mango\.collegeboard\.org\/cbmango1\/prod\/apricot\/all\/\d+\/(.*)\.js/i;
for (i = 0; i < x.length; i++) {
ref = x[i].src;
if(ref.match(re)) val = re.exec(ref)[1];
}
}
if (!val) {
x = document.getElementsByTagName('link');
re = /apricot/i;
for (i = 0; i < x.length; i++) {
ref = x[i].href;
if(ref.match(re)) val = 'apricot-version-unknown';
}
}
if (!val) {
x = document.scripts;
re = /apricot/i;
for (i = 0; i < x.length; i++) {
ref = x[i].src;
if(ref.match(re)) val = 'apricot-version-unknown';
}
}
if (!val) val = 'apricot-not-found';
//if (val) _satellite.notify(ruleName+': ('+valSrc+') '+ val);
return val;
},"storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"CB Account New Account Created": {"queryParam":"newaccount","storeLength":"pageview","forceLowerCase":true,"cleanText":true,"ignoreCase":1},
"CB Web - Account ID": {"jsVariable":"kiwi.user.cbId","default":"Not Logged In","storeLength":"pageview"},
"CB Web - Account Type": {"jsVariable":"kiwi.user.type","default":"Not Logged In","storeLength":"pageview"},
"CB Web - Gender": {"jsVariable":"kiwi.user.gender","default":"Not Logged In","storeLength":"pageview"},
"CB Web - Grade Level": {"jsVariable":"kiwi.user.gradeLevel","default":"Not Logged In","storeLength":"pageview"},
"CB Web - Grad Year": {"jsVariable":"kiwi.user.gradYear","default":"Not Logged In","storeLength":"pageview"},
"CB Web - Job Title Code": {"jsVariable":"kiwi.user.jobTitle","default":"Not Logged In","storeLength":"pageview"},
"CB Web - Logged In State": {"customJS":function(){
/**
* Created by jbeach on 2015??
* Updated by jbeach on 2019-06-10
*/
kiwi = window.kiwi || {};
//var ruleName='KIWI: Data Element > CB Web - Logged In State';
var val = 'Not Logged In';
if (kiwi.userIsLoggedIn) {
val = 'Logged In';
if (kiwi.user.interim) val += ' (Interim)';
}
//if (val) _satellite.notify(ruleName+': ('+valSrc+') '+ val);
return val;
},"storeLength":"pageview"},
"CB Web - Org ID": {"jsVariable":"kiwi.user.orgId","default":"Not Logged In","storeLength":"pageview"},
"College ID": {"jsVariable":"cbTrackData.college.id","default":"0000","storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"College Profile View Data": {"customJS":function(){
/**
* Created by jbeach on 2017-03-03
*/
var result = {};
if (typeof s != 'undefined' &&
s.events &&
s.events.match(/event22/)) {
result = {
event22: s.events
}
}
return result;
},"storeLength":"pageview"},
"College Search Data": {"customJS":function(){
/**
* Created by jbeach on 2017-03-06
*/
var result = {};
if (typeof s != 'undefined' &&
s.events &&
s.events.match(/event68/)) {
result = {
event68: s.events
}
}
return result;
},"storeLength":"pageview"},
"College Search Selection Data": {"customJS":function(){
/**
* Created by jbeach on 2017-03-06
*/
var result = {};
if (typeof s != 'undefined' &&
s.events &&
s.events.match(/event76/)) {
result = {
event76: s.events
}
}
return result;
},"storeLength":"pageview"},
"Cookie - CBTrack - Nav": {"cookie":"cbtrack_nav","storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"Cookie - kiwi_crm_id": {"cookie":"kiwi_crm_id","storeLength":"pageview"},
"Cookie - Kiwi Lifetime": {"cookie":"kiwi_life","storeLength":"pageview"},
"Cookie - Kiwi Lifetime - Marketing": {"cookie":"kiwi_cookie","storeLength":"pageview"},
"Cookie - Kiwi Session": {"cookie":"kiwi_sess","storeLength":"pageview"},
"Data - AP Exam Intent": {"customJS":function(){
/**
* Created by jbeach on 2020-04-10
* Created by jbeach on 2020-04-10
*/
var ruleName='KIWI: Data Element > Data - AP Exam Intent';
var result = { hasData: true };
/*
//usage in analytics:
* pattern: [Poll ID]:[Submitted Date];[AP Exam]:[count each yes/uns/no];[AP YouTube]:[y/n];[AP Prac]:[y/n]
* eg: ap1:20200413;ex:y00|u01|n02;yt:ys;pr:no
s.eVar92 = oData.pollResponse; //SFMC Poll Responses
s.events = s.apl(s.events, 'event192', ',', 2); //SFMC Poll Submissions
s.linkTrackVars=s.apl(s.linkTrackVars, 'events', ',', 2);
s.linkTrackVars=s.apl(s.linkTrackVars, 'eVar92', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event92', ',', 2);
*/
/*
//usage in DOM:
form#APIntentTest
input[name="ViewingOnlineClasses"].value
input[name="PracticingForExam"].value
input#radio-4-326452-y
input#radio-4-326452-u
input#radio-4-326452-n
input#radio-28-331373-y
input#radio-28-331373-u
input#radio-28-331373-n
*/
//collect data
var form = document.querySelector('form#APIntentTest'),
pollResponse = '[POLLID]:[SUBMITDATE];ex:y[COUNTY]|u[COUNTU]|n[COUNTN];yt:[YOUTUBE];pr:[PRACTICE]',
pollId = 'ap1',
todaysDate = new Date(),
convertDate = function(date) {
var yyyy = date.getFullYear().toString(),
mm = (date.getMonth()+1).toString(),
dd = date.getDate().toString(),
mmChars = mm.split(''),
ddChars = dd.split('');
return yyyy + (mmChars[1]?mm:'0'+mmChars[0]) + (ddChars[1]?dd:'0'+ddChars[0]);
},
submitDate = convertDate(todaysDate),
countY = countU = countN = '00',
youtube = practice = 'uk',
youtubeInputValueMap = practiceInputValueMap = {
'Y':'ys',
'N':'no'
};
if(form) {
var checkedInputs = form.querySelectorAll('input:checked'),
courseTotalY = courseTotalU = courseTotalN = 0;
for (var i = 0; i < checkedInputs.length; i++) {
var input = checkedInputs[i],
inputName = input.getAttribute('name'),
inputValue = input.getAttribute('value');
switch (inputName) {
case 'ViewingOnlineClasses':
youtube = youtubeInputValueMap[inputValue];
break;
case 'PracticingForExam':
practice = practiceInputValueMap[inputValue];
break;
default://it's one of the courses
switch (inputValue) {
case 'Y':
courseTotalY++;
break;
case 'U':
courseTotalU++;
break;
case 'N':
courseTotalN++;
break;
default:
break;
}
countY = (courseTotalY>9)?courseTotalY.toString():'0'+courseTotalY.toString();
countU = (courseTotalU>9)?courseTotalU.toString():'0'+courseTotalU.toString();
countN = (courseTotalN>9)?courseTotalN.toString():'0'+courseTotalN.toString();
break;
}
}
}
pollResponse = pollResponse.replace(/(\[POLLID\])/i, pollId);
pollResponse = pollResponse.replace(/\[SUBMITDATE\]/i, submitDate);
pollResponse = pollResponse.replace(/\[COUNTY\]/i, countY);
pollResponse = pollResponse.replace(/\[COUNTU\]/i, countU);
pollResponse = pollResponse.replace(/\[COUNTN\]/i, countN);
pollResponse = pollResponse.replace(/\[YOUTUBE\]/i, youtube);
pollResponse = pollResponse.replace(/\[PRACTICE\]/i, practice);
result = {
hasData: true,
pollResponse: pollResponse
};
if (result.hasData) _satellite.notify(ruleName+': '+ JSON.stringify(result));
return result;
},"storeLength":"pageview"},
"Data - AP FYM Event": {"customJS":function(){
/**
* Created by jbeach on 2017-11-10
* Updated by jbeach on 2018-01-22
*/
var ruleName='KIWI: Data Element > Data - AP FYM Event';
/* DDL SCHEMA
//AP Student Registration event (Serialized once per AP Student ID)
window.cbTrackData.apRegistration = {
studentId: 317612, //AP Student ID which is 1-1 to BS Person ID and CB Web Account ID.
studentOrgId: 128215, //Ord ID of the student's selected school at time of AP Student Registration
studentGradeLevel: 3 //AP Student-selected grade level; number value from 1-6
}
//AP Course Join event (Serialized once per AP Student per Course Offering)
window.cbTrackData.apCourseEnrollment = {
apCourseIds: [34], //array; Standard CB AP Course ID mappings e.g. 34 = AP World History
educationPeriod: 19, //also: 20, 21, 22; represents the second YY of the school year; will be used to serialize event
studentIds: [317612], //array; AP Student ID which is 1-1 to BS Person ID and CB Web Account ID
courseOrgId: 128215 //Ord ID of the school offering the course
}
//AP Exam Registration event (Serialized once per AP Student per Course Offering)
window.cbTrackData.apExamRegistration = {
apCourseIds: [34], //array; Standard CB AP Course ID mappings e.g. 34 = AP World History
educationPeriod: 19, //also: 20, 21, 22; represents the second YY of the school year; will be used to serialize event
studentIds: [317612], //array; AP Student ID which is 1-1 to BS Person ID and CB Web Account ID
courseOrgId: 128215 //Ord ID of the school offering the course
}
*/
var result = { hasData: false },
apReg = _satellite.getVar('AppData AP Student Registration'),
apCourse = _satellite.getVar('AppData AP Course Enrollment'),
apExam = _satellite.getVar('AppData AP Exam Registration');
if (apReg || apCourse || apExam) {
result = {
hasData: true,
apReg: {
hasData: false,
studentId: apReg.studentId || '',
studentOrgId: apReg.studentOrgId || '',
studentGradeLevel: apReg.studentGradeLevel || ''
},
apCourse: {
hasData: false,
apCourseIds: apCourse.apCourseIds || '',
educationPeriod: apCourse.educationPeriod || '',
studentIds: apCourse.studentIds || '',
courseOrgId: apCourse.courseOrgId || ''
},
apExam: {
hasData: false,
apCourseIds: apExam.apCourseIds || '',
educationPeriod: apExam.educationPeriod || '',
studentIds: apExam.studentIds || '',
courseOrgId: apExam.courseOrgId || ''
}
};
}
if (apReg.studentId) result.apReg.hasData = true;
if (apCourse.studentIds && apCourse.apCourseIds && apCourse.educationPeriod) result.apCourse.hasData = true;
if (apExam.studentIds && apExam.apCourseIds && apExam.educationPeriod) result.apExam.hasData = true;
//if (result.hasData) _satellite.notify(ruleName+': '+ JSON.stringify(result));
return result;
},"storeLength":"pageview"},
"Data - AP Score Match": {"customJS":function(){
/**
* Created by jbeach on 2017-05-09
*/
var ruleName='KIWI: Data Element > Data - AP Score Match';
var result = { hasData: false };
if (typeof s != 'undefined' &&
s.events &&
s.events.match(/event77/)) {
result = {
hasData: true,
event77: s.events
};
}
//if (result.hasData) _satellite.notify(ruleName+': '+ JSON.stringify(result));
return result;
},"storeLength":"pageview"},
"Data - AP Score Send": {"customJS":function(){
/**
* Created by jbeach on 2017-05-09
*/
var ruleName='KIWI: Data Element > Data - AP Score Send';
var result = { hasData: false };
if (typeof s != 'undefined' &&
s.events &&
s.events.match(/event79/)) {
result = {
hasData: true,
event79: s.events,
orderType: s.eVar16,
purchaseId: s.purchaseID,
products: s.products
};
}
//if (result.hasData) _satellite.notify(ruleName+': '+ JSON.stringify(result));
return result;
},"storeLength":"pageview"},
"Data - AP Score View": {"customJS":function(){
/**
* Created by jbeach on 2017-05-09
*/
var ruleName='KIWI: Data Element > Data - AP Score View';
var result = { hasData: false };
if (typeof s != 'undefined' &&
s.events &&
s.events.match(/event78:/) &&
s.eVar65) {
result = {
hasData: true,
event78: s.events,
eVar65: s.eVar65
};
}
//if (result.hasData) _satellite.notify(ruleName+': '+ JSON.stringify(result));
return result;
},"storeLength":"pageview","forceLowerCase":true},
"Data - CAFW Printed": {"customJS":function(){
/**
* Created by jbeach on 2017-08-25
*/
var ruleName='KIWI: Data Element > Data - CAFW Printed';
var result = { hasData: false };
if (typeof s != 'undefined' &&
s.events &&
s.events.match(/event82:/)) {
result = {
hasData: true,
events: s.events
}
}
//if (result.hasData) _satellite.notify(ruleName+': '+ JSON.stringify(result));
return result;
},"storeLength":"pageview"},
"Data - CBOS": {"customJS":function(){
/**
* Created by jbeach on 2019-10-07
* Updated by jbeach on 2019-10-07
*/
kiwi = window.kiwi || {};
kiwi.ddl = kiwi.ddl || {};
kiwi.ddl.cbos = kiwi.ddl.cbos || {};
var ruleName='KIWI: Data Element > Data - CBOS';
/* DDL SCHEMA
kiwi.ddl ==>
cbos: {
build: {
inProgress: false, //options: true, false
fulfilled: false //options: true, false
},
practice: {
inProgress: false, //options: true, false
fulfilled: false //options: true, false
},
improve: {
practiceFulfilled: false, //options: true, false
scoreFulfilled: false, //options: true, false
inProgress: false, //options: true, false
fulfilled: false //options: true, false
},
strengthen: {
inProgress: false, //options: true, false
fulfilled: false, //options: true, false
reach: false, //options: true, false
match: false, //options: true, false
safety: false //options: true, false
},
complete: {
fafsaSubmitted: false, //options: true, false
fulfilled: false //options: true, false
},
apply: {
inProgress: false, //options: true, false
fulfilled: false, //options: true, false
totalEntriesEarned: 1 //options: 1-5
},
cyj: {
fulfilled: false //options: true, false
}}
*/
var result = { hasData: false };
if (kiwi.ddl.cbos) {
var build, practice, improve, strengthen, complete, apply, cyj;
if (kiwi.ddl.cbos.build) build = kiwi.ddl.cbos.build.fulfilled || false;
if (kiwi.ddl.cbos.practice) practice = kiwi.ddl.cbos.practice.fulfilled || false;
if (kiwi.ddl.cbos.improve) improve = kiwi.ddl.cbos.improve.fulfilled || false;
if (kiwi.ddl.cbos.strengthen) strengthen = kiwi.ddl.cbos.strengthen.fulfilled || false;
if (kiwi.ddl.cbos.complete) complete = kiwi.ddl.cbos.complete.fulfilled || false;
if (kiwi.ddl.cbos.apply) apply = kiwi.ddl.cbos.apply.fulfilled || false;
if (kiwi.ddl.cbos.cyj) cyj = kiwi.ddl.cbos.cyj.fulfilled || false;
result = {
hasData: true,
build: build || false,
practice: practice || false,
improve: improve || false,
strengthen: strengthen || false,
complete: complete || false,
apply: apply || false,
cyj: cyj || false
};
}
//if (result.hasData) _satellite.notify(ruleName+': '+ JSON.stringify(result));
return result;
},"storeLength":"pageview"},
"Data - CBOS - Colleges Apply": {"customJS":function(){
/**
* Created by jbeach on 2019-10-07
* Updated by jbeach on 2019-10-07
*/
//expecting: oData = {isNowFulfilled, collegesCount, collegeNames (pipe-sep)}
kiwi = window.kiwi || {};
kiwi.ddl = kiwi.ddl || {};
kiwi.ddl.event = kiwi.ddl.event || {};
kiwi.ddl.event.cbosCollegesApply = kiwi.ddl.event.cbosCollegesApply || {};
var ruleName='KIWI: Data Element > Data - CBOS - Colleges Apply';
/* DDL SCHEMA
kiwi.ddl ==>
event: {
cbosCollegesApply: {
added: [ //array of colleges user added on this event... if user can only ever add one at a time, do not use array
{
collegeId: 707, //user selected a known college, this is its CB Org ID value
collegeName: 'Babson College', //friendly/display name of selected known college
collegeState: 'MA' //two-letter state value associated with the known college, if not international
},
{
collegeId: null, //user typed in an unknown college
collegeName: 'jerusalem University', //whatever string user typed in
collegeState: null //user typed in an unknown college
}
],
isNowFulfilled: true, //true, false; representing if the scholarship was fulfilled on this apply event (e.g. 1 entry earned)
nowHasTotalEntries: 1 //number 1-5; representing the total entries earned with this apply event
}}
*/
var result = { hasData: false };
if (kiwi.ddl.event.cbosCollegesApply) {
var arrAdded = kiwi.ddl.event.cbosCollegesApply.added || [],
collegesCount = 0,
arrCollegeNames = [];
if (arrAdded.length) {
collegesCount = arrAdded.length;
arrAdded.forEach(function(oCollege) {
if (oCollege.collegeName) {
if (oCollege.collegeId) {
arrCollegeNames.push(oCollege.collegeName);
} else {
arrCollegeNames.push('typed:'+oCollege.collegeName);
}
}
});
}
result = {
hasData: true,
isNowFulfilled: kiwi.ddl.event.cbosCollegesApply.isNowFulfilled || false,
collegesCount: collegesCount,
collegeNames: arrCollegeNames.join('|')
};
//Reset DDL!
kiwi.ddl.event.cbosCollegesApply = {}
}
//if (result.hasData) _satellite.notify(ruleName+': '+ JSON.stringify(result));
return result;
},"storeLength":"pageview"},
"Data - CB Web Login": {"customJS":function(){
/**
* Created by jbeach on 2018-12-28
* Updated by jbeach on 2019-07-24
*/
//var ruleName='KIWI: Data Element > Data - CB Web Login';
var result = { hasData: false };
//Check WEP Cookie
var wepCookie = _satellite.getVar('IAM Cookie - WAP_EXTERNAL_PROPERTIES'),
oWep = {};
if (wepCookie) {
//process cookie data
var wepArr = wepCookie.split('~');
for (var i = 0; i < wepArr.length; i++) {
var wep = wepArr[i].split('|'),
wepName = wep[0],
wepValue = decodeURIComponent(wep[1]);
switch (wepName) {
case 'events':
oWep.events = wepValue;
break;
case 'interim':
oWep.interim = !!(wepValue==='1');
break;
case 'eVar19':
oWep.appId = wepValue;
break;
case 'prop33':
oWep.type = wepValue;
break;
case 'prop4':
oWep.id = wepValue;
break;
case 'prop56':
oWep.orgId = wepValue;
break;
case 'eVar24':
oWep.gender = wepValue;
break;
case 'eVar23':
oWep.gradYear = wepValue;
break;
case 'eVar25':
oWep.jobTitle = wepValue;
break;
case 'eVar22':
case 'eVar34':
case 'prop39':
case 'eVar17':
case 'prop40':
default:
//ignore
break;
}
}
//adjust job title and grad year for opposite account types
if (oWep.type === 'EPL') {
oWep.gradYear = 'Professional';
oWep.gradeLevel = 'Professional';
}
if (oWep.type === 'ECL') {
if (oWep.interim) oWep.type += '-interim';
oWep.jobTitle = 'Student';
//process gradeLevel
if (oWep.gradYear) {
//calculate grade level
var epc = _satellite.getVar('Derived Education Period Code'), //19
sy = '',
gy = parseInt(oWep.gradYear, 10), //2018
diff = '',
gl = '';
if (epc && gy) {
sy = epc + 1999; //2018
diff = gy - sy; //0
switch (diff) {
case 3:
gl = 1; //Freshman
break;
case 2:
gl = 2; //Sophomore
break;
case 1:
gl = 3; //Junior
break;
case 0:
gl = 4; //Senior
break;
default:
if ((diff) < 0) gl = 5; //Out of HS
if ((diff) > 3) gl = 6; //Not yet in HS
break;
}
}
oWep.gradeLevel = gl;
}
}
if (oWep.gender === 'ANOTHER') oWep.gender = 'Another';
result = {
hasData: true,
events: oWep.events || '',
interim: oWep.interim || false,
appId: oWep.appId || '',
type: oWep.type || '',
id: oWep.id || '',
orgId: oWep.orgId || 'None Provided',
gender: oWep.gender || 'None Provided',
gradYear: oWep.gradYear || 'None Provided',
gradeLevel: oWep.gradeLevel || 'None Provided',
jobTitle: oWep.jobTitle || 'None Provided'
};
}
//if (result.hasData) _satellite.notify(ruleName+': '+ JSON.stringify(result));
return result;
},"storeLength":"pageview"},
"Data - College List": {"customJS":function(){
/**
* Created by jbeach on 2019-08-01
* Updated by jbeach on 2019-08-15
*/
kiwi = window.kiwi || {};
kiwi.ddl = kiwi.ddl || {};
kiwi.ddl.myCollegesList = kiwi.ddl.myCollegesList || {};
kiwi.ddl.myCollegesList.reach = kiwi.ddl.myCollegesList.reach || [];
kiwi.ddl.myCollegesList.match = kiwi.ddl.myCollegesList.match || [];
kiwi.ddl.myCollegesList.safety = kiwi.ddl.myCollegesList.safety || [];
kiwi.ddl.myCollegesList.generic = kiwi.ddl.myCollegesList.generic || [];
kiwi.ddl.myCollegesFulfilled = kiwi.ddl.myCollegesFulfilled || {};
kiwi.ddl.myCollegesFulfilled.rms = kiwi.ddl.myCollegesFulfilled.rms || false;
var ruleName='KIWI: Data Element > Data - College List';
/* DDL SCHEMA
user: {isFocusCohort: true, isCbosOptedIn: false},
myCollegesList: {reach: Array(1), match: Array(0), safety: Array(0), generic: Array(1)},
myCollegesFulfilled: {rms: false, reach: false, match: false, safety: false},
myCollegesScoreInput: {score: 1240, scoreType: "estimatedSat"}
*/
var result = { hasData: false };
if (kiwi.ddl.myCollegesList.reach.length ||
kiwi.ddl.myCollegesList.match.length ||
kiwi.ddl.myCollegesList.safety.length ||
kiwi.ddl.myCollegesList.generic.length) {
result = {
hasData: true,
rmsListStarted: (kiwi.ddl.myCollegesList.reach.length ||
kiwi.ddl.myCollegesList.match.length ||
kiwi.ddl.myCollegesList.safety.length)?true:false,
rmsListFulfilled: kiwi.ddl.myCollegesFulfilled.rms
};
}
//if (result.hasData) _satellite.notify(ruleName+': '+ JSON.stringify(result));
return result;
},"storeLength":"pageview"},
"Data - College List Add": {"customJS":function(){
/**
* Created by jbeach on 2019-08-01
* Updated by jbeach on 2019-08-15
*/
kiwi = window.kiwi || {};
kiwi.ddl = kiwi.ddl || {};
kiwi.ddl.page = kiwi.ddl.page || {};
kiwi.ddl.page.appViewCode = kiwi.ddl.page.appViewCode || '';
kiwi.ddl.event = kiwi.ddl.event || {};
kiwi.ddl.event.collegeAdd = kiwi.ddl.event.collegeAdd || {};
kiwi.ddl.event.collegeAdd.addSource = kiwi.ddl.event.collegeAdd.addSource || 'BF React';
kiwi.ddl.event.collegeAdd.addMethod = kiwi.ddl.event.collegeAdd.addMethod || '';
kiwi.ddl.event.collegeAdd.collegeId = kiwi.ddl.event.collegeAdd.collegeId || '';
kiwi.ddl.event.collegeAdd.collegeName = kiwi.ddl.event.collegeAdd.collegeName || '';
kiwi.ddl.event.collegeAdd.isFirstCollege = kiwi.ddl.event.collegeAdd.isFirstCollege || false;
kiwi.ddl.event.collegeAdd.isRmsCollege = kiwi.ddl.event.collegeAdd.isRmsCollege || false;
var ruleName='KIWI: Data Element > Data - College List Add';
/* DDL SCHEMA
kiwi.ddl ==>
user: {isFocusCohort: true, isCbosOptedIn: false},
page: {pageCode: '', appViewCode: ''},
myCollegesList: {reach: Array(1), match: Array(0), safety: Array(0), generic: Array(1)},
myCollegesFulfilled: {rms: false, reach: false, match: false, safety: false},
myCollegesScoreInput: {score: 1240, scoreType: "estimatedSat"},
event: { collegeAdd: {
addSource: '', //empty string from app, derived by kiwi code
addMethod: '', //empty string from app, derived by kiwi code
collegeId: 707,
collegeName: 'Babson College',
isFirstCollege: true,
isRmsCollege: true
}}
*/
var result = { hasData: false };
if (kiwi.ddl.event.collegeAdd.collegeName) {
//build addMethod from addSource DDL
var derivedAddMethod = 'Unknown';
switch (kiwi.ddl.event.collegeAdd.addSource) {
case 'BF GWT':
derivedAddMethod = _satellite.getVar('AppData College List Add Method');
break;
case 'BF Mobile':
derivedAddMethod = kiwi.ddl.event.collegeAdd.addMethod;
break;
default: //BF React
derivedAddMethod = 'FROM_STRNSRCH';
break;
}
result = {
hasData: true,
addSource: kiwi.ddl.event.collegeAdd.addSource,
addMethod: derivedAddMethod,
collegeAdded: kiwi.ddl.event.collegeAdd.collegeName,
isFirstCollege: kiwi.ddl.event.collegeAdd.isFirstCollege,
isRmsCollege: kiwi.ddl.event.collegeAdd.isRmsCollege
};
//Reset DDL!
kiwi.ddl.event.collegeAdd = {}
}
//if (result.hasData) _satellite.notify(ruleName+': '+ JSON.stringify(result));
return result;
},"storeLength":"pageview"},
"Data - IAM Score Match": {"customJS":function(){
/**
* Created by jbeach on 2017-11-22
* Updated by jbeach on 2018-01-23
*/
var ruleName='KIWI: Data Element > Data - IAM Score Match';
var result = { hasData: false };
if (typeof s != 'undefined' &&
s.events &&
s.events.match(/event15/)) {
result = {
hasData: true,
events: 'event15',
matchAttempts: s.eVar69 || '',
matchMethod: s.eVar70 || '',
matchTestType: s.eVar73 || ''
};
}
//if (result.hasData) _satellite.notify(ruleName+': '+ JSON.stringify(result));
return result;
},"storeLength":"pageview"},
"Data - IFrame Report Name": {"customJS":function(){
/**
* Created by jbeach on 2019-05-29
* Updated by jbeach on 2019-06-25
*/
kiwi = window.kiwi || {};
kiwi.util = kiwi.util || {};
kiwi.util.sanitizeString = kiwi.util.sanitizeString || function() {_satellite.notify('Missing function: kiwi.util.sanitizeString()');};
kiwi.util.getFeatureText = kiwi.util.getFeatureText || function() {_satellite.notify('Missing function: kiwi.util.getFeatureText()');};
//var ruleName='KIWI: Data Element > Data - IFrame Report Name';
var val = '',
elem = kiwi._elementToTest || '',
map = {
'Equity And Excellence': 'equity-excel',
'Instructional Planning Report': 'inst-plan',
'Organization Score Roster': 'roster-orgscr',
'Scholar Roster': 'roster-scholar',
'Subject Score Roster': 'roster-subjscr',
'Five Year Score Summary': 'sum-5yr',
'Current Year Score Summary': 'sum-curryr',
'Summary by Student Demographics': 'sum-dem',
'District Summary By School': 'sum-org',
'Scholar Summary': 'sum-scholar'
},
map2 = {
'Calculus AB': 'ap-calculus-ab',
'United States History': 'ap-us-history',
'English Language and Composition': 'ap-english-lang',
'English Literature and Composition': 'ap-english-lit',
'Chemistry': 'ap-chemistry',
'Biology': 'ap-biology',
'Statistics': 'ap-statistics',
'Spanish Language and Culture': 'ap-spanish-lang',
'World History': 'ap-world-history',
'Psychology': 'ap-psychology',
'Calculus BC': 'ap-calculus-bc',
'United States Government and Politics': 'ap-us-gopo',
'Physics 1': 'ap-physics-1',
'Human Geography': 'ap-human-geo',
'Environmental Science': 'ap-enviro-sci',
'Macroeconomics': 'ap-macroeconomics',
'Computer Science A': 'ap-comp-sci-a',
'European History': 'ap-euro-history',
'Studio Art: 2-D Design Portfolio': 'ap-art-2d-design',
'Studio Art: Drawing Portfolio': 'ap-art-drawing',
'Physics C: Mechanics': 'ap-physics-c-mech',
'Computer Science Principles': 'ap-csp',
'Spanish Literature and Culture': 'ap-spanish-lit',
'Music Theory': 'ap-music-theory',
'French Language and Culture': 'ap-french',
'Microeconomics': 'ap-microeconomics',
'Art History': 'ap-art-history',
'Seminar': 'ap-seminar',
'Studio Art: 3-D Design Portfolio': 'ap-art-3d-design',
'Comparative Government and Politics': 'ap-comparative-gopo',
'Latin': 'ap-latin',
'German Language and Culture': 'ap-german',
'Physics C: Electricity and Magnetism': 'ap-physics-c-elec-mag',
'Research': 'ap-research',
'Physics 2': 'ap-physics-2',
'Japanese Language and Culture': 'ap-japanese',
'Chinese Language and Culture': 'ap-chinese',
'Italian Language and Culture': 'ap-italian',
'Physics B': 'ap-physics-b'
},
attrVal = [],
repName = '',
subjName = '';
if (elem) {
attrVal = elem.getAttribute('data-cbtrack-iframereport').split(':');
//examples:
// (no subect) school:Subject Score Roster:2019:ap
// (subject-specific) school:Subject Score Roster:2019:Computer Science Principles
if (attrVal && attrVal[1]) {
repName = attrVal[1];
if (repName && map[repName]) {attrVal[1] = map[repName];}
else {attrVal[1] = kiwi.util.sanitizeString(repName);}
subjName = attrVal[3];
if (subjName && map2[subjName]) {attrVal[3] = map2[subjName];}
else {attrVal[3] = kiwi.util.sanitizeString(subjName);}
val = attrVal.join(':');
} else {
val = kiwi.util.getFeatureText(elem);
}
}
//if (val) _satellite.notify(ruleName+': '+ val);
return val;
/* Data Examples
IF NO Subject is Selected If report includes Subject Selection
district:inst-plan:2019:ap district:inst-plan:2019:ap-biology
district:roster-orgscr:2019:ap
district:roster-subjscr:2019:ap district:roster-subjscr:2019:ap-biology
school:inst-plan:2019:ap school:inst-plan:2019:ap-biology
school:roster-orgscr:2019:ap
school:roster-scholar:2019:ap
school:roster-subjscr:2019:ap school:roster-subjscr:2019:ap-biology
school:sum-curryr:2019:ap
district:sum-curryr:2019:ap
school:equity-excel:2019:ap
district:equity-excel:2019:ap
school:sum-5yr:2019ap
district:sum-org:2019:ap
school:sum-dem:2019:ap
district:sum-dem:2019:ap
district:sum-scholar:2019:ap
*/
},"storeLength":"pageview"},
"Data - LIFW Form": {"customJS":function(){
/**
* Created by jbeach on 2018-11-26
* Created by jbeach on 2018-11-27
*/
var ruleName='KIWI: Data Element > Data - LIFW Form';
var result = { hasData: false };
/*
//usage in analytics:
var oData = _satellite.getVar('Data - Data - LIFW Form');
if (oData && oData.hasData) {
_satellite.notify('KIWI: Data - LIFW Form found: ' + JSON.stringify(oData));
if (oData.liQualOption) {
s.events = s.apl(s.events, 'event35:'+serializeVal, ',', 2); //LI/FW Opt Ins
} else {
s.events = s.apl(s.events, 'event36:'+oData.serializeText, ',', 2); //LI/FW Opt Outs
}
s.linkTrackVars=s.apl(s.linkTrackVars, 'events', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event35,event36', ',', 2);
}
*/
/*
//usage in DOM:
form[data-cbtrack-lifw]
input#liQualYes, name=liQual > liQualYes || 'true'
input#liQualNo, name=liQual > liQualNo || 'false'
*/
//collect data
var form = document.querySelector('form[data-cbtrack-lifw]');
if(form) {
var liQualChecked = form.querySelector('input[name=liQual]:checked');
if (liQualChecked) {
result = {
hasData: true,
liQualOption: (liQualChecked.value==='true')?true:false
};
}
}
if (result.hasData) _satellite.notify(ruleName+': '+ JSON.stringify(result));
return result;
},"storeLength":"pageview"},
"Data - NSAT Purchase": {"customJS":function(){
/**
* Created by jbeach on 2017-08-21
* Updated by jbeach on 2018-01-19
*/
kiwi = window.kiwi || {};
kiwi._thisPage = kiwi._thisPage || {};
kiwi._thisPage.siteCode = kiwi._thisPage.siteCode || '';
s = window.s || {};
var ruleName='KIWI: Data Element > Data - NSAT Purchase';
var result = { hasData: false };
if (kiwi._thisPage.siteCode == 'nsat' &&
typeof s !== 'undefined' &&
s.purchaseID &&
s.eVar16 &&
s.eVar16.match(/SAT Cross-Sell|SAT Scores|Answer Services/i) &&
s.events &&
!s.events.match(/event2:/i)) {
result = {
hasData: true,
orderType: s.eVar16,
purchaseId: s.purchaseID,
products: s.products,
testType: s.eVar26,
registrantType: s.eVar40,
adminCode: s.eVar49,
events: s.events
};
}
//if (result.hasData) _satellite.notify(ruleName+': '+ JSON.stringify(result));
return result;
},"storeLength":"pageview"},
"Data - Page Track": {"customJS":function(){
/**
* Created by jbeach on 2019-09-16
* Updated by jbeach on 2019-09-17
*/
//var ruleName='KIWI: Data Element > Data - Page Track';
kiwi.pageTrack = kiwi.pageTrack || {};
kiwi.pageTrack.arrStack = kiwi.pageTrack.arrStack || [];
var result = { hasData: false },
obj = {
source: '',
pageName: ''
};
if(kiwi.pageTrack.arrStack.length) {
// take the earliest tracked page and shift it off
obj = kiwi.pageTrack.arrStack.shift();
}
if (obj.source) {
result.hasData = true;
result.source = obj.source || 'undefined';
result.pageName = obj.pageName || _satellite.getVar('Page Name');
}
return result;
},"storeLength":"pageview"},
"Data - Parent Opt In": {"customJS":function(){
/**
* Created by jbeach on 2018-04-18
* Created by jbeach on 2018-06-11
*/
var ruleName='KIWI: Data Element > Data - Parent Opt In';
var result = { hasData: false };
/*
//usage in analytics:
var oData = _satellite.getVar('Data - Parent Opt In');
if (oData && oData.hasData) {
_satellite.notify('KIWI: Data - Parent Opt In found: ' + JSON.stringify(oData));
s.eVar84 = oData.gradYears; //Parent Opted Grad Years
if (oData.serializeEmail) s.events = s.apl(s.events, 'event114:'+oData.serializeEmail, ',', 2); //Parent Email Opt-Ins
if (oData.serializeText) s.events = s.apl(s.events, 'event115:'+oData.serializeText, ',', 2); //Parent Text Opt-Ins
s.linkTrackVars=s.apl(s.linkTrackVars, 'events,eVar84', ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, 'event114,event115', ',', 2);
}
*/
/*
//usage in DOM:
form#webform-client-form-371
input#edit-submitted-email-address, name=submitted[email_address] > parentEmailAddr
input#edit-submitted-cell-phone-number, name=submitted[cell_phone_number] > parentPhone
input#edit-submitted-opt-in-for-emails-1, name=submitted[opt_in_for_emails][yes] > emailsOptIn
input#edit-submitted-opt-in-for-text-messages-1, name=submitted[cell_phone_number] > textsOptIn
input#edit-submitted-student-1-graduating-class-of-student-1-1, name=submitted[student_1][graduating_class_of_student_1], value=2018 > gradYear kid 1, option 1
input#edit-submitted-student-1-graduating-class-of-student-1-2, name=submitted[student_1][graduating_class_of_student_1], value=2019 > gradYear kid 1, option 2
input#edit-submitted-student-2-graduating-class-of-student-2-1, name=submitted[student_2][graduating_class_of_student_2], value=2018 > gradYear kid 2, option 1
input#edit-submitted-student-2-graduating-class-of-student-2-2, name=submitted[student_2][graduating_class_of_student_2], value=2019 > gradYear kid 2, option 2
*/
//collect data
var form = document.querySelector('form#webform-client-form-226');
if(form) {
var inputEmailAddr = form.querySelector('input#edit-submitted-email-address');
var inputPhone = form.querySelector('input#edit-submitted-cell-phone-number');
var inputEmailsYes = form.querySelector('input#edit-submitted-opt-in-for-emails-1');
var inputTextsYes = form.querySelector('input#edit-submitted-opt-in-for-text-messages-1');
var formData = {};
formData.optInEmail = (inputEmailsYes && inputEmailsYes.checked && inputEmailsYes.checked != false);
formData.optInPhone = (inputTextsYes && inputTextsYes.checked && inputTextsYes.checked != false);
if (inputEmailAddr) formData.parentEmailAddr = formData.optInEmail?inputEmailAddr.value:'';
if (inputPhone) formData.parentPhone = formData.optInPhone?inputPhone.value:'';
//loop grad year selections
formData.gradYears = '|';
for (var i = 1; i <= 10; i++) {
var selector = 'input[name="submitted[student_'+i+'][graduating_class_of_student_'+i+']"]:checked';
var checkedInputGradYear = form.querySelector(selector);
if (checkedInputGradYear) formData.gradYears += checkedInputGradYear.value + '|';
}
if (formData.gradYears === '|') formData.gradYears = 'None Selected';
result = {
hasData: true,
serializeEmail: formData.parentEmailAddr,
serializeText: formData.parentPhone,
gradYears: formData.gradYears
};
}
if (result.hasData) _satellite.notify(ruleName+': '+ JSON.stringify(result));
return result;
},"storeLength":"pageview"},
"Data - RMS Score Change": {"customJS":function(){
/**
* Created by jbeach on 2019-08-05
* Updated by jbeach on 2019-08-15
*/
kiwi = window.kiwi || {};
kiwi.ddl = kiwi.ddl || {};
kiwi.ddl.event = kiwi.ddl.event || {};
kiwi.ddl.event.rmsScoreChange = kiwi.ddl.event.rmsScoreChange || {};
kiwi.ddl.event.rmsScoreChange.scoreType = kiwi.ddl.event.rmsScoreChange.scoreType || '';
kiwi.ddl.event.rmsScoreChange.score = kiwi.ddl.event.rmsScoreChange.score || '';
var ruleName='KIWI: Data Element > Data - RMS Score Change';
/* DDL SCHEMA
kiwi.ddl ==>
user: {isFocusCohort: true, isCbosOptedIn: false},
page: {pageCode: '', appViewCode: ''},
myCollegesList: {reach: Array(1), match: Array(0), safety: Array(0), generic: Array(1)},
myCollegesFulfilled: {rms: false, reach: false, match: false, safety: false},
myCollegesScoreInput: {score: 1240, scoreType: 'estimatedSat'},
event: { rmsScoreChange: {
scoreType: 'officialSat', //options: officialSat, estimatedSat, estimatedAct
score: '1100' //example
}}
*/
var result = { hasData: false };
if (kiwi.ddl.event.rmsScoreChange.scoreType) {
//set up score type pretty names map
var scoreTypePretty = {
'SAT': 'Official SAT',
'ESAT': 'Estimated SAT',
'ACT': 'Estimated ACT'
};
result = {
hasData: true,
scoreType: scoreTypePretty[kiwi.ddl.event.rmsScoreChange.scoreType],
score: kiwi.ddl.event.rmsScoreChange.score
};
//Reset DDL!
kiwi.ddl.event.rmsScoreChange = {}
}
//if (result.hasData) _satellite.notify(ruleName+': '+ JSON.stringify(result));
return result;
},"storeLength":"pageview"},
"Data - SAT Reg": {"customJS":function(){
/**
* Created by jbeach on 2017-07-13
* Updated by jbeach on 2019-04-03
*/
//var ruleName='KIWI: Data Element > Data - SAT Reg';
var result = { hasData: false },
regNo = _satellite.getVar('AppData SAT Reg Number');
if (typeof s != 'undefined' &&
s.events &&
s.events.match(/event2:/i)) {
// parse Products
var arrProds = s.products.split(','),
isChange = false,
isIntlReg = false,
isLateReg = false,
isQASReg = false,
isSASReg = false,
isCoreReg = false,
isSubjReg = false,
totalSubj = 0,
isWaitlistReg = false,
hasXsellProds = false,
isEssayReg = false,
isSsdReg = false,
isFeeWaiverReg = false;
for (var i = 0; i < arrProds.length; i++) {
var arrProd = arrProds[i].split(';');
if (arrProd) var prodSku = arrProd[1];
if (prodSku) {
if(prodSku.match(/^SAT-/i)) {
if (prodSku.match(/^SAT-CHG-FEE-WEB-YYMM$/i)) isChange = true;
if (prodSku.match(/^SAT-INTL-FEE-.*-YYMM$/i)) isIntlReg =true;
if (prodSku.match(/^SAT-LATE-REG-FEE-YYMM$/i)) isLateReg = true;
if (prodSku.match(/^SAT-QAS-/i)) isQASReg = true;
if (prodSku.match(/^SAT-SAS-/i)) isSASReg = true;
if (prodSku.match(/^SAT-SAT-REAS-TEST-FEE-YYMM$/i)) isCoreReg = true;
if (prodSku.match(/^SAT-SAT-SUBJ-TEST-REG-FEE-YYMM$/i)) isSubjReg = true;
if (prodSku.match(/^SAT-SAT-STF-.*-YYMM$/i)) totalSubj += 1;
if (prodSku.match(/^SAT-WAITLIST-REG-FEE-YY$/i)) isWaitlistReg = true;
} else {
hasXsellProds = true;
}
}
}
// parse if SAT with Essay
if (isCoreReg) {
var ticketTestType = _satellite.getVar('DOM nsat AdmissionTicketTestType');
isEssayReg = ticketTestType.match(/SAT with Essay/i);
}
// parse if Fee Waiver
if (s.events.match(/event50:/i)) isFeeWaiverReg = true;
// parse if SSD
//TODO: figure out how to get if SSD
// parse adminType
adminType = isSubjReg?'satst':isEssayReg?'satwe':'satne';
result = {
hasData: true,
orderType: s.eVar16,
purchaseId: s.purchaseID,
products: s.products,
testType: s.eVar26,
registrantType: s.eVar40,
adminCode: s.eVar49,
events: ['purchase'],
adminType: adminType //satst, satwe, satne
};
var satRegsEventArray = [
['subj-reg', 'event25'],
['feewaiver-reg', 'event50'],
['core-reg', 'event120'],
['essay-reg', 'event130'],
['subj-count', 'event129'],
['intl-reg', 'event128'],
['late-reg', 'event127'],
['qas-reg', 'event126'],
['sas-reg', 'event125'],
['waitlist-reg', 'event124'],
['xsell-reg', 'event123'],
['ssd-reg', 'event122'],
['change-reg', 'event121']
];
//NOT ENOUGH BROWSER SUPPORT YET for "Map"
//var satRegsEventMap = new Map(satRegsEventArray);
//if (isChange) arrEvents.push(satRegsEventMap.get('change-reg'));
var arrEvents = [];
for (var j = 0; j < satRegsEventArray.length; j++) {
var eventKey = satRegsEventArray[j][0],
eventVal = satRegsEventArray[j][1];
//Reg Events Pattern: eventXX:[SAT Reg Number]
if (isChange && eventKey == 'change-reg') arrEvents.push(eventVal+':'+regNo);
if (isIntlReg && eventKey == 'intl-reg') arrEvents.push(eventVal+':'+regNo);
if (isLateReg && eventKey == 'late-reg') arrEvents.push(eventVal+':'+regNo);
if (isQASReg && eventKey == 'qas-reg') arrEvents.push(eventVal+':'+regNo);
if (isSASReg && eventKey == 'sas-reg') arrEvents.push(eventVal+':'+regNo);
if (isCoreReg && eventKey == 'core-reg') arrEvents.push(eventVal+':'+regNo);
if (isWaitlistReg && eventKey == 'waitlist-reg') arrEvents.push(eventVal+':'+regNo);
if (hasXsellProds && eventKey == 'xsell-reg') arrEvents.push(eventVal+':'+regNo);
if (isEssayReg && eventKey == 'essay-reg') arrEvents.push(eventVal+':'+regNo);
if (isSsdReg && eventKey == 'ssd-reg') arrEvents.push(eventVal+':'+regNo);
if (isFeeWaiverReg && eventKey == 'feewaiver-reg') arrEvents.push(eventVal+':'+regNo);
if (isSubjReg) {
if (eventKey == 'subj-reg') arrEvents.push(eventVal+':'+regNo);
if (eventKey == 'subj-count') arrEvents.push(eventVal+':'+regNo+'='+totalSubj);
}
}
if (arrEvents.length) {
result.events.push(arrEvents);
}
}
//if (result.hasData) _satellite.notify(ruleName+': '+ JSON.stringify(result));
return result;
/* Product Codes Mapping:
SAT-CHG-FEE-WEB-YYMM Change Fee
SAT-INTL-FEE-AFRICA-YYMM International Reg
SAT-INTL-FEE-AMERICAS-YYMM International Reg
SAT-INTL-FEE-EAST-ASIA-PAC-YYMM International Reg
SAT-INTL-FEE-EUR-EURASIA-YYMM International Reg
SAT-INTL-FEE-MIDDLE-EAST-YYMM International Reg
SAT-INTL-FEE-SOUTH-CEN-ASIA-YYMM International Reg
SAT-LATE-REG-FEE-YYMM Late Reg
SAT-QAS-1605 QAS
SAT-QAS-1705 QAS
SAT-QAS-1805 QAS
SAT-QAS-YYMM QAS
SAT-SAS-1703 SAS
SAT-SAS-1706 SAS
SAT-SAS-1806 SAS
SAT-SAS-YYMM SAS
SAT-SAT-REAS-TEST-FEE-YYMM Core Reg
SAT-SAT-STF-BIO-EM-YYMM Subject
SAT-SAT-STF-CHEM-YYMM Subject
SAT-SAT-STF-CHNSE-WL-YYMM Subject
SAT-SAT-STF-FRNCH-RO-YYMM Subject
SAT-SAT-STF-FRNCH-WL-YYMM Subject
SAT-SAT-STF-GRMN-RO-YYMM Subject
SAT-SAT-STF-GRMN-WL-YYMM Subject
SAT-SAT-STF-HIST-US-YYMM Subject
SAT-SAT-STF-HIST-WRLD-YYMM Subject
SAT-SAT-STF-ITLN-RO-YYMM Subject
SAT-SAT-STF-JAPNSE-WL-YYMM Subject
SAT-SAT-STF-KORN-WL-YYMM Subject
SAT-SAT-STF-LATN-RO-YYMM Subject
SAT-SAT-STF-LIT-YYMM Subject
SAT-SAT-STF-MATH-IC-YYMM Subject
SAT-SAT-STF-MATH-IIC-YYMM Subject
SAT-SAT-STF-MODHBRW-RO-YYMM Subject
SAT-SAT-STF-PHY-YYMM Subject
SAT-SAT-STF-SPNSH-RO-YYMM Subject
SAT-SAT-STF-SPNSH-WL-YYMM Subject
SAT-SAT-SUBJ-TEST-REG-FEE-YYMM Subj Test Reg
SAT-STDNT-SCORE-RPT-YY Score Send
SAT-WAITLIST-REG-FEE-YY Waitlist
*/
},"storeLength":"pageview"},
"Data - SAT Reg Cross-Sell": {"customJS":function(){
/**
* REQUIRES JQUERY
* Created by jbeach on 2017-07-28
* Updated by jbeach on 2018-01-23
*/
var ruleName='KIWI: Data Element > Data - SAT Reg Cross-Sell';
var result = { hasData: false },
productsMashup = '';
if (typeof s != 'undefined' &&
s.events &&
s.events.match(/prodView/) &&
s.eVar37 &&
s.eVar37 == 'SAT Cross-Sell') {
//collect items from DOM
if (typeof jQuery != 'undefined') {//jQuery library exists
jQuery( document ).ready(function( $ ) {//alias $ in-case another '$' exists on page
//collect products detail from DOM
var $elsSku = $('table.s2-crosssell-product-table input[name^="xsellSku"]'),
$elsPrice = $('table.s2-crosssell-product-table .registration-crosssell-product-price-text'),
arrProds = [];
$elsSku.each(function(index) {
var price = $( $elsPrice.get( index )).text().replace(/\$/i, '');
arrProds.push(';'+$(this).val()+';1;'+price);
});
productsMashup = arrProds.join(',');
});
}
if (!productsMashup) productsMashup = s.products;
result = {
hasData: true,
prodViewSource: 'SAT Cross-Sell',
products: productsMashup
};
}
//if (result.hasData) _satellite.notify(ruleName+': '+ JSON.stringify(result));
return result;
},"storeLength":"pageview"},
"Data - SAT Reg Step": {"customJS":function(){
/**
* Created by jbeach on 2017-07-26
* Updated by jbeach on 2018-12-28
*/
//var ruleName='KIWI: Data Element > Data - SAT Reg Step';
kiwi = window.kiwi || {};
kiwi.user = kiwi.user || {};
var result = { hasData: false },
//flow = _satellite.getVar('AppData Flow Code'),
steps = _satellite.getVar('AppData Flow Steps'),
regNo = _satellite.getVar('AppData SAT Reg Number'),
syCode = _satellite.getVar('Derived Education Period Code');
syCode = parseInt(syCode, 10) - 1;
if (kiwi.user.cbId) {
var reachedStepEventArray = [
['choose-center', 'event71'],
['photo', 'event72'],
['crosssell', 'event73'],
['purchase-review', 'event107'],
['purchase-complete', 'event108'],
['reg-review', 'event74'],
['reg-complete','event2'],
['ticket','event75'],
['change-ticket','event75']
];
//NOT ENOUGH BROWSER SUPPORT YET for "Map"
//var reachedStepEventMap = new Map(reachedStepEventArray);
var sySawStepEventArray = [
['begin', 'event150'],
['profile-pi', 'event151'],
['profile-dg', 'event152'],
['contract-optin', 'event153'],
['sdq-cbprograms', 'event154'],
['sdq-gparank', 'event155'],
['sdq-cw-math', 'event156'],
['sdq-cw-english', 'event157'],
['sdq-cw-science', 'event158'],
['sdq-cw-socialstudies', 'event159'],
['sdq-cw-languages', 'event160'],
['sdq-cw-artsmusic', 'event161'],
['sdq-hsactivities', 'event162'],
['sdq-collegeplans', 'event163'],
['terms', 'event164'],
['choose-test', 'event165'],
['choose-center', 'event166'],
['photo', 'event167'],
['photo-facebook', 'event168'],
['crosssell', 'event169'],
['purchase-review', 'event170'],
['purchase-accept', 'event171'],
['purchase-complete', 'event172'],
['reg-review', 'event173'],
['reg-accept', 'event174'],
['reg-complete','event175'],
['ticket','event176'],
['change-begin', 'event180'],
['change-profile-pi', 'event181'],
['change-test', 'event182'],
['change-center', 'event183'],
['change-photo', 'event184'],
['change-crosssell', 'event185'],
['change-review', 'event186'],
['change-accept', 'event187'],
['change-complete','event188'],
['change-ticket','event189']
];
//NOT ENOUGH BROWSER SUPPORT YET for "Map"
//var sySawStepEventMap = new Map(sySawStepEventArray);
//Reached Step Pattern: eventXX:[SAT Reg Number]
//School Year Saw Step Pattern: eventXX:[School Year End YY]-[CB Web Account ID]
var stepEvents = [];
for (var i = 0; i < steps.length; i++) {
//var reachedStepEvent = reachedStepEventMap.get(steps[i]);
(function() {
for (var j = 0; j < reachedStepEventArray.length; j++) {
var stepKey = reachedStepEventArray[j][0],
stepEvent = reachedStepEventArray[j][1];
if (stepKey == steps[i]) stepEvents.push(stepEvent+':'+regNo);
}
})();
//var sySawStepEvent = sySawStepEventMap.get(steps[i]);
(function() {
for (var j = 0; j < sySawStepEventArray.length; j++) {
var stepKey = sySawStepEventArray[j][0],
stepEvent = sySawStepEventArray[j][1];
if (stepKey == steps[i]) stepEvents.push(stepEvent+':'+syCode+'-'+kiwi.user.cbId);
}
})();
}
if (stepEvents.length) {
result = {
hasData: true,
stepEvents: stepEvents
};
}
}
//if (result.hasData) _satellite.notify(ruleName+': '+ JSON.stringify(result));
return result;
},"storeLength":"pageview"},
"Data - Score View": {"customJS":function(){
/**
* Created by jbeach on 2017-01-30
* Updated by jbeach on 2019-09-30
*/
kiwi = window.kiwi || {};
kiwi.ddl = kiwi.ddl || {};
kiwi.ddl.aaTracked = kiwi.ddl.aaTracked || {};
var ruleName='KIWI: Data Element > Data - Score View';
var result = { hasData: false },
hasSat = false,
hasPsat = false,
ddlSatScores = kiwi.ddl.satScores || _satellite.getVar('DDL - SAT Scores'),
ddlPsatScores = kiwi.ddl.psatScores || _satellite.getVar('DDL - PSAT Scores'),
singleSatScore = null,
singlePsatScore = null,
appDataSatScoreView = _satellite.getVar('AppData SAT Score View'),
appDataPsatScoreView = _satellite.getVar('AppData PSAT Score Viewed'),
satScoreViewed = {
adminType: '',
adminCode: '',
adminRegId: '',
registrantType: '',
fwStatus: '',
totalScore: ''
},
psatScoreViewed = {
adminType: '',
adminCode: '',
adminRegId: '',
registrantType: '',
fwStatus: '',
totalScore: ''
};
result.sat = {
adminType: '',
adminCode: '',
adminRegId: '',
registrantType: '',
fwStatus: '',
scoreBand: ''
};
result.psat = {
adminType: '',
adminCode: '',
registrantType: '',
fwStatus: '',
scoreBand: ''
};
if (kiwi.ddl.aaTracked.scoreView) {
ddlSatScores = null;
ddlPsatScores = null;
}
//parse by object schema (4 different schemas -
// 1 SSR Cloud 10/2019
// 2 SSR - updated
// 3 SSR - legacy
// 4 DOP/Profile Widget,
// 5 NSAT My SAT
// function for dynamic sorting
// Taken from https://www.sitepoint.com/sort-an-array-of-objects-in-javascript/
// modified to work on IE11 by jbeach on 2019-09-18
function compareValues(key, order) {
order = order || 'asc'
return function(a, b) {
if(!a.hasOwnProperty(key) || !b.hasOwnProperty(key)) {
// property doesn't exist on either object
return 0;
}
const varA = (typeof a[key] === 'string') ?
a[key].toUpperCase() : a[key];
const varB = (typeof b[key] === 'string') ?
b[key].toUpperCase() : b[key];
let comparison = 0;
if (varA > varB) {
comparison = 1;
} else if (varA < varB) {
comparison = -1;
}
return (
(order == 'desc') ? (comparison * -1) : comparison
);
};
}
//get values
//Multiple SAT Scores
(function(data){
/* EXAMPLE *
0: {admin: {โ€ฆ}, taker: {โ€ฆ}, hold: "", regDetail: {โ€ฆ}, score: {โ€ฆ}, โ€ฆ}
1: {admin: {โ€ฆ}, taker: {โ€ฆ}, hold: "", regDetail: {โ€ฆ}, score: {โ€ฆ}, โ€ฆ}
2: {admin: {โ€ฆ}, taker: {โ€ฆ}, hold: "", regDetail: {โ€ฆ}, score: {โ€ฆ}, โ€ฆ}
3: {admin: {โ€ฆ}, taker: {โ€ฆ}, hold: "", regDetail: {โ€ฆ}, score: {โ€ฆ}, โ€ฆ}
4: {admin: {โ€ฆ}, taker: {โ€ฆ}, hold: "pending", regDetail: {โ€ฆ}}
5: {admin: {โ€ฆ}, taker: {โ€ฆ}, hold: "", regDetail: {โ€ฆ}, score: {โ€ฆ}, โ€ฆ}
6: {admin: {โ€ฆ}, taker: {โ€ฆ}, hold: "coming", regDetail: {โ€ฆ}} */
if (data) {
_satellite.notify(ruleName + ' - ddlSatScores: ' + JSON.stringify(ddlSatScores));
var sortableData = [];
for (i = 0; i < data.length; i++) {
if (data[i].hold === '') { //not on hold
if (data[i].admin) {
sortableData[i] = {
ts: data[i].admin.date,
satScore: data[i]
}
}
}
}
sortableData.sort(compareValues('ts', 'desc'));
if (sortableData[0]) {
singleSatScore = sortableData[0].satScore
_satellite.notify(ruleName + ' - singleSatScore: ' + JSON.stringify(singleSatScore));
}
}
})(ddlSatScores);
var ddlSatScore = singleSatScore || kiwi.ddl.satScore || _satellite.getVar('DDL - SAT Score');
if (kiwi.ddl.aaTracked.scoreView) {
ddlSatScore = null;
}
//Single SAT Score
(function(data){
/* EXAMPLE *
admin: {date: 1539144000000, type: "SATNE", code: "201830"}
benchmark: {ebrw: 480, math: 530}
hold: ""
regDetail: {regID: "8CA335975E5604BEE05319442D0AC01F", eventType: "c", firstSAT: false}
score: {total: 603, ebrw: 310, math: 293}
taker: {grade: "11th Grade", orgId: 471065, re: Array(1), majors: Array(0), khan: false} */
if (data) {
_satellite.notify(ruleName + ' - ddlSatScore/singleSatScore: ' + JSON.stringify(data));
data.admin = data.admin || {};
data.regDetail = data.regDetail || {};
data.score = data.score || {};
if (data.hold === '') { //not on hold
satScoreViewed.adminType = data.admin.type; //options: satne, satwe, satst, csat
satScoreViewed.adminCode = data.admin.code; //options: [yyyy][mm, 22, 23, 24, 30, 43, 44, 50, 81, 82, 83, 84, 85, 86, 90, 91, 92]
satScoreViewed.adminRegId = data.regDetail.regID;
if (data.regDetail.hasOwnProperty('firstSAT')) {
if (data.regDetail.firstSAT) { //options: first-sat-any, repeat-sat-any
satScoreViewed.registrantType = 'first-sat-any';
} else {
satScoreViewed.registrantType = 'repeat-sat-any';
}
}
if (data.regDetail.hasOwnProperty('feeWaiver')) {
if (data.regDetail.feeWaiver) { //options: no-fee-waiver, used-fee-waiver
satScoreViewed.fwStatus = 'used-fee-waiver';
} else {
satScoreViewed.fwStatus = 'no-fee-waiver';
}
}
if (data.score.hasOwnProperty('total')) satScoreViewed.totalScore = data.score.total;
}
}
singleSatScore = null;
})(ddlSatScore);
//Multiple PSAT Scores
(function(data){
if (data) {
_satellite.notify(ruleName + ' - ddlPsatScores: ' + JSON.stringify(ddlPsatScores));
var sortableData = [];
for (i = 0; i < data.length; i++) {
if (data[i].hold === '') { //not on hold
if (data[i].admin) {
sortableData[i] = {
ts: data[i].admin.date,
score: data[i]
}
}
}
}
sortableData.sort(compareValues('ts', 'desc'));
if (sortableData[0]) {
singlePsatScore = sortableData[0].score
_satellite.notify(ruleName + ' - singlePsatScore: ' + JSON.stringify(singlePsatScore));
}
}
})(ddlPsatScores);
var ddlPsatScore = singlePsatScore || kiwi.ddl.psatScore || _satellite.getVar('DDL - PSAT Score');
if (kiwi.ddl.aaTracked.scoreView) {
ddlPsatScore = null;
}
//Single PSAT Score
(function(data){
/* EXAMPLE * */
if (data) {
_satellite.notify(ruleName + ' - ddlPsatScore/singlePsatScore: ' + JSON.stringify(data));
data.admin = data.admin || {};
data.score = data.score || {};
if (data.hold === '') { //not on hold
psatScoreViewed.adminType = data.admin.type; //options:
psatScoreViewed.adminCode = data.admin.code; //options: [yyyy][f, s]
psatScoreViewed.adminCode = psatScoreViewed.adminCode.replace(/-Fall/,'f');
psatScoreViewed.adminCode = psatScoreViewed.adminCode.replace(/-Spring/,'s');
if (data.regDetail.hasOwnProperty('firstPSAT')) {
if (data.regDetail.firstPSAT) { //options: first-psat-any, repeat-psat-any
psatScoreViewed.registrantType = 'first-psat-any';
} else {
psatScoreViewed.registrantType = 'repeat-psat-any';
}
}
if (data.regDetail.hasOwnProperty('feeWaiver')) {
if (data.regDetail.feeWaiver) { //options: no-fee-waiver, used-fee-waiver
psatScoreViewed.fwStatus = 'used-fee-waiver';
} else {
psatScoreViewed.fwStatus = 'no-fee-waiver';
}
}
if (data.score.hasOwnProperty('total')) psatScoreViewed.totalScore = data.score.total;
}
}
singlePsatScore = null;
})(ddlPsatScore);
//LEGACY SCHEMAS
if (appDataSatScoreView || appDataPsatScoreView) { // widget, SSR
_satellite.notify(ruleName + ' - appDataSatScoreView: ' + JSON.stringify(appDataSatScoreView));
_satellite.notify(ruleName + ' - appDataPsatScoreView: ' + JSON.stringify(appDataPsatScoreView));
if (appDataSatScoreView.at || appDataPsatScoreView.at) { //SSR
if(appDataSatScoreView.at) {
var tmpSatSVType = 'SAT';
if (appDataSatScoreView.partial == 5) {
tmpSatSVType = 'SAT';
} else if (appDataSatScoreView.partial == 6) {
tmpSatSVType = 'Partial SAT';
}
}
var psatScore = '',
satScore = '';
if (cbTrackData &&
cbTrackData.svS &&
cbTrackData.svS.scr &&
cbTrackData.svS.scr.t) {
satScore = parseInt(cbTrackData.svS.scr.t,10);
}
if (cbTrackData &&
cbTrackData.svP &&
cbTrackData.svP.scr &&
cbTrackData.svP.scr.t) {
psatScore = parseInt(cbTrackData.svP.scr.t,10);
}
satScoreViewed = {
adminType: appDataSatScoreView.at,
adminCode: appDataSatScoreView.ac,
adminRegId: appDataSatScoreView.rgid,
registrantType: '',
fwStatus: '',
totalScore: satScore
};
psatScoreViewed = {
adminType: appDataPsatScoreView.at,
adminCode: appDataPsatScoreView.ac,
registrantType: '',
fwStatus: '',
totalScore: psatScore
};
} else if (appDataSatScoreView.adminTypeCode === 1 || appDataSatScoreView.adminTypeCode === 2 || appDataPsatScoreView.scoreViewType === 'PSAT') { //Widget SAT, PSAT before 2018f
if (appDataSatScoreView.scoreViewTypeCode == 5) {
appDataSatScoreView.scoreViewType = 'SAT';
} else if (appDataSatScoreView.scoreViewTypeCode == 6) {
appDataSatScoreView.scoreViewType = 'Partial SAT';
}
switch (appDataSatScoreView.adminTypeDescription) {
case 'SAT with essay':
appDataSatScoreView.adminType = 'satwe';
break;
case 'SAT without essay':
appDataSatScoreView.adminType = 'satne';
break;
default:
break;
}
satScoreViewed = {
adminType: appDataSatScoreView.adminType,
adminCode: appDataSatScoreView.adminCode,
adminRegId: appDataSatScoreView.adminRegId,
registrantType: '',
fwStatus: '',
totalScore: ''
};
psatScoreViewed = {
adminType: appDataPsatScoreView.adminType,
adminCode: appDataPsatScoreView.adminCode,
registrantType: '',
fwStatus: '',
totalScore: ''
};
} else if (appDataPsatScoreView.asmtTitle && appDataPsatScoreView.asmtTitle.match(/psat/i)) { //Widget PSAT 2018f
appDataPsatScoreView.adminCode = appDataPsatScoreView.adminYear;
var adminDate = new Date(appDataPsatScoreView.eventStartDate);
if (adminDate.getMonth() < 6) appDataPsatScoreView.adminCode += 's';
else appDataPsatScoreView.adminCode += 'f';
switch (appDataPsatScoreView.asmtTitle) {
case 'PSAT 10 & PSAT/NMSQT':
switch (appDataPsatScoreView.adminTypeDescription) {
case 'PSAT/NMSQT':
appDataPsatScoreView.adminType = 'psatnm';
break;
case 'PSAT 10':
appDataPsatScoreView.adminType = 'psat10';
break;
default:
break;
}
break;
case 'PSAT 8/9':
appDataPsatScoreView.adminType = 'psat89';
break;
default:
break;
}
psatScoreViewed = {
adminType: appDataPsatScoreView.adminType,
adminCode: appDataPsatScoreView.adminCode,
registrantType: '',
fwStatus: '',
totalScore: ''
};
}
} else if (typeof s != 'undefined' && s.events && s.events.match(/event24:/i) && s.eVar51) { //NSAT
var arrV51 = s.eVar51.split('-'),
arrEvents = s.events.split(','),
s_adminType = '',
s_adminCode = '',
s_adminRegId = '';
if (arrV51[0]) s_adminType = arrV51[0];
if (arrV51[1]) s_adminCode = arrV51[1];
for (var i = 0; i < arrEvents.length; i++) {
var arrEvent = arrEvents[i].split(':');
if (arrEvent[0] && arrEvent[0] == 'event24') {
var arrSer = arrEvent[1].split('-');
if (arrSer[0]) s_adminRegId = arrSer[0];
}
}
satScoreViewed = {
adminType: s_adminType,
adminCode: s_adminCode,
adminRegId: s_adminRegId,
registrantType: '',
fwStatus: '',
totalScore: ''
};
}
//SAT Score Viewed
(function(data){
/* EXAMPLE *
adminType: "SATNE"
adminCode: "201830"
adminRegId: "8CA335975E5604BEE05319442D0AC01F"
registrantType: "repeat-sat-any"
fwStatus: ""
scoreTotal: 603 */
if (data && data.adminCode) {
hasSat = true;
result.sat.adminType = data.adminType; //options: satne, satwe, satst, csat
result.sat.adminCode = data.adminCode; //options: [yyyy][mm, 22, 23, 24, 30, 43, 44, 50, 81, 82, 83, 84, 85, 86, 90, 91, 92]
result.sat.adminRegId = data.adminRegId;
result.sat.registrantType = data.registrantType; //options: first-sat-any, repeat-sat-any
result.sat.fwStatus = data.fwStatus; //options: no-fee-waiver, used-fee-waiver
if (isNaN(data.scoreTotal) || data.scoreTotal > 1600) { //options: <1050, 1050-1400, >1400
//skip
} else if (data.scoreTotal < 1050) {
result.sat.scoreBand = '<1050';
} else if (data.scoreTotal < 1401) {
result.sat.scoreBand = '1050-1400';
} else {
result.sat.scoreBand = '>1400';
}
}
})(satScoreViewed);
//PSAT Score Viewed
(function(data){
/* EXAMPLE * */
if (data && data.adminCode) {
hasPsat = true;
result.psat.adminType = data.adminType; //options:
result.psat.adminCode = data.adminCode; //options: [yyyy][f, s]
result.psat.registrantType = data.registrantType; //options: first-psat-any, repeat-psat-any
result.psat.fwStatus = data.fwStatus; //options: no-fee-waiver, used-fee-waiver
if (isNaN(data.scoreTotal) || data.scoreTotal > 1520) { //options: <1050, 1050-1400, >1400
//skip
} else if (data.scoreTotal < 1050) {
result.psat.scoreBand = '<1050';
} else if (data.scoreTotal < 1401) {
result.psat.scoreBand = '1050-1400';
} else {
result.psat.scoreBand = '>1400';
}
}
})(psatScoreViewed);
//pass values to result
if (hasSat || hasPsat) result.hasData = true;
//if (result.hasData) _satellite.notify(ruleName+': '+ JSON.stringify(result));
return result;
/* New SSR
window.cbTrackData.svS = {
rgid: '2B836820287E7E4BE05319442C0A456A', //"Admin Reg ID"
partial: ASMT_SESSION_PART_SCORE_ST_CD, //"Score Status" e.g. 5 if complete, 6 if official pending essay score
at: assessmentType, //"Assessment Type" shorten codes e.g. sne, swe, sjt; also cs? (before 3/2016 redesign)
et: eventTypeDescription, //"Event Type (Standard or Contract)" first letter only e.g. s, c; Should this also include Transactional (t)?
ac: sourceAdminYYYYMM, //"Admin Code" e.g. 201805, 201724, 201603, 201530
tkr: {//"Admin Taker" all values inside this object should represent data points of the user at time of test taking; not necessarily what's stored in their CB Account now
g: educationLevelDescription, //"Grade" convert to number or single letter; e.g. 8, 9, 10, 11, 12, K
aic: personSnapshotStudentAiCode, //"Attending Institution (AI) Code" e.g. 123456
re: [personSnapshotEthnicityList[0], ... personSnapshotEthnicityList[n]], //"Race/Ethnicity" e.g. [4, 5, 9, โ€ฆ]
ml: [personSnapshotMajorList[0] ... personSnapshotMajorList[n]], //"Majors" e.g. [1469, 103, โ€ฆ]
ka: ?? //"Has Khan Account Link" e.g. true, false
},
scr: {//"Student Score"
t: studentScoreTotalScoreScoreTierBasicInfoScore, //"Total Score" e.g. 400, 410, 420, ...
e: studentScoreSectionScores0scoreTierBasicInfoScore, //"EBRW Score" e.g. 200, 210, 220, ...
m: studentScoreSectionScores1scoreTierBasicInfoScore //"Math Score" e.g. 200, 210, 220, ...
},
bmk: {//"Benchmark Score"
e: studentScoreSectionScores0scoreTierBasicInfoBenchmarkThreshold, //"EBRW Benchmark Score" e.g. 480, ...
m: studentScoreSectionScores1scoreTierBasicInfoBenchmarkThreshold //"Math Benchmark Score" e.g. 530, ...
}
}
*/
//LEGACY SSR
//window.cbTrackData.appDataSatScoreViewed={
// scoreViewType: 'SAT', //also: Partial SAT
// adminType: 'satwe', //also: satne, csat, satst
// adminCode: '201610', //also: 201603, 201724, 201530
// adminRegId: '2B836820287E7E4BE05319442C0A456A'
//}
//Values Passed by Profile Widget
//SAT With Essay
// "scoreViewTypeCode":"5",
// "adminTypeCode":"1",
// "adminTypeDescription":"SAT with essay",
// "adminCode":"201603",
// "adminRegId":"2A5555B0AC1A50F1E05319442D0A5DFD"
//SAT Without Essay
// "scoreViewTypeCode":"5",
// "adminTypeCode":"2",
// "adminTypeDescription":"SAT without essay",
// "adminCode":"201803",
// "adminRegId":"675209C507AB3F4FE05319442D0A55A3"
//PN
// adminCode: null
// adminRegId: null
// adminTypeCode: "4"
// adminTypeDescription: "PSAT/NMSQT"
// adminYear: "2018"
// asmtTitle: "PSAT 10 & PSAT/NMSQT"
// eventStartDate: 1539403200000
// scoreViewTypeCode: "5"
//PSAT 10
// adminCode: null
// adminRegId: null
// adminTypeCode: "3"
// adminTypeDescription: "PSAT 10"
// adminYear: "2018"
// asmtTitle: "PSAT 10 & PSAT/NMSQT"
// eventStartDate: 1519621200000
// scoreViewTypeCode: "5"
//PSAT 8/9
// adminCode: null
// adminRegId: null
// adminTypeCode: "-2"
// adminTypeDescription: "N/A"
// adminYear: "2018"
// asmtTitle: "PSAT 8/9"
// eventStartDate: 1537761600000
// scoreViewTypeCode: "5"
//Values Passed by NSAT MySAT
//s.events += ',event24:2ABA7B9D971E2B1FE05319442D0AC8E7-SATWE-201603';
//s.eVar51='SATWE-201603';
},"storeLength":"pageview"},
"Data - Score View - Latest Score Hold Type": {"customJS":function(){
/**
* Created by jbeach on 2019-09-30
* Updated by jbeach on 2019-09-30
*/
kiwi = window.kiwi || {};
kiwi.util = kiwi.util || {};
kiwi.ddl = kiwi.ddl || {};
kiwi.ddl.aaTracked = kiwi.ddl.aaTracked || {};
var ruleName='KIWI: Data Element > Data - Score View - Latest Score Hold Type';
var val = '',
ddlSatScores = kiwi.ddl.satScores || _satellite.getVar('DDL - SAT Scores'),
ddlPsatScores = kiwi.ddl.psatScores || _satellite.getVar('DDL - PSAT Scores'),
sortableData = [],
sortableDataCount = 0;
//Multiple SAT Scores
(function(data){
/* EXAMPLE *
0: {admin: {โ€ฆ}, taker: {โ€ฆ}, hold: "", regDetail: {โ€ฆ}, score: {โ€ฆ}, โ€ฆ}
1: {admin: {โ€ฆ}, taker: {โ€ฆ}, hold: "", regDetail: {โ€ฆ}, score: {โ€ฆ}, โ€ฆ}
2: {admin: {โ€ฆ}, taker: {โ€ฆ}, hold: "", regDetail: {โ€ฆ}, score: {โ€ฆ}, โ€ฆ}
3: {admin: {โ€ฆ}, taker: {โ€ฆ}, hold: "", regDetail: {โ€ฆ}, score: {โ€ฆ}, โ€ฆ}
4: {admin: {โ€ฆ}, taker: {โ€ฆ}, hold: "pending", regDetail: {โ€ฆ}}
5: {admin: {โ€ฆ}, taker: {โ€ฆ}, hold: "balance", regDetail: {โ€ฆ}}
6: {admin: {โ€ฆ}, taker: {โ€ฆ}, hold: "coming", regDetail: {โ€ฆ}} */
if (data) {
_satellite.notify(ruleName + ' - ddlSatScores: ' + JSON.stringify(ddlSatScores));
for (var i = 0; i < data.length; i++) {
if (data[i].admin) {
sortableData[i] = {
ts: data[i].admin.date,
hold: data[i].hold
}
}
}
sortableDataCount = sortableData.length;
}
})(ddlSatScores);
//Multiple PSAT Scores
(function(data){
if (data) {
_satellite.notify(ruleName + ' - ddlPsatScores: ' + JSON.stringify(ddlPsatScores));
for (var i = 0; i < data.length; i++) {
if (data[i].admin) {
sortableData[i+sortableDataCount] = {
ts: data[i].admin.date,
hold: data[i].hold
}
}
}
}
})(ddlPsatScores);
sortableData.sort(kiwi.util.compareValues('ts', 'desc'));
if (sortableData[0]) {
val = sortableData[0].hold
}
//if (result.hasData) _satellite.notify(ruleName+': '+ JSON.stringify(result));
return val;
},"storeLength":"pageview"},
"Data - Test Order": {"customJS":function(){
/**
* Created by jbeach on 2017-12-06
* Updated by jbeach on 2018-04-27
*/
var ruleName='KIWI: Data Element > Data - Test Order';
var result = { hasData: false },
appDataTestOrderData = _satellite.getVar('AppData Test Order'),
scrapedTestOrderData = _satellite.getVar('Scraped Test Order Data'),
rawTestOrderData = appDataTestOrderData || scrapedTestOrderData,
derivedAdminName = '',
derivedAdminDate = '',
derivedAdminSeason = '',
derivedAdminTypeCode = '',
derivedAdminCode = '',
derivedSerializeCode = '',
adminType = '';
if(rawTestOrderData.adminName) {
switch (rawTestOrderData.adminName.toLowerCase()) {
case 'sat school day':
derivedAdminName = 'sat';
break;
case 'psat/nmsqtยฎ':
derivedAdminName = 'pn';
break;
case 'psatโ„ข 10':
derivedAdminName = 'p10';
break;
case 'psatโ„ข 8/9':
derivedAdminName = 'p89';
break;
default:
derivedAdminName = 'error';
break;
}
}
if(rawTestOrderData.adminDate) {
var dAdminDate = new Date(rawTestOrderData.adminDate),
yyyy = (dAdminDate.getFullYear()).toString(),
mm = (dAdminDate.getMonth() + 101).toString().substring(1, 3),
dd = (dAdminDate.getDate() + 100).toString().substring(1, 3);
derivedAdminDate = yyyy+mm+dd;
derivedAdminSeason = dAdminDate.getMonth()<6?'s':'f'; //fall or spring for serialization;
derivedSerializeCode = derivedAdminName + rawTestOrderData.aiCode + derivedAdminSeason + yyyy.substring(2); //once per ai, per admin type, per season
}
if(rawTestOrderData.adminType) derivedAdminTypeCode = rawTestOrderData.adminType.substring(0,1).toLowerCase();
if (derivedAdminName) derivedAdminCode = derivedAdminName + '-' + derivedAdminDate + '-' + derivedAdminTypeCode;
if(rawTestOrderData.aiCode && derivedAdminCode && derivedSerializeCode) {
result = {
hasData: true,
aiCode: rawTestOrderData.aiCode,
adminCode: derivedAdminCode,
serializeCode: derivedSerializeCode,
orderType: 'TOS Order'
/* SKUs Tracking TBD
, purchaseId: s.purchaseID,
products: [{
sku: '',
qty: '',
cost: 0
}]*/
};
}
if (result.hasData) _satellite.notify(ruleName+': '+ JSON.stringify(result));
return result;
/*
* Example Result
* result = {
hasData: true,
adminCode: satsd-20181010-t,
appOrgId: 331055,
orderType: 'TOS Order',
purchaseId: TBD, //need to make it up
products: [{//SAT WE
sku: '',
qty: '',
cost: 0
},{//SAT NE
sku: '',
qty: '',
cost: 0
},{//BOOKLETS
sku: '',
qty: '',
cost: 0
},{//TEST ORDER SCRIPTS
sku: '',
qty: '',
cost: 0
},{//SSD ITEMS
sku: '',
qty: '',
cost: 0
},{//FEE WAIVERS
sku: '',
qty: '',
cost: 0
}]
};
* */
/** DOM Text Data Samples
* SCHOOLS:
* FAIRFAX HIGH SCHOOL (470785)
* VILLA RICA HIGH SCHOOL (113130)
* BENNETT HIGH SCHOOL (331055)
* BAYSIDE HIGH SCHOOL (330355)
*
* TY18-19 ADMINS:
SAT School Day
Wednesday October 10, 2018 - sat-20181010-t/c
Wednesday March 6, 2019 - sat-20190319-t/c
Wednesday March 27, 2019 - sat-20190327-t/c
Tuesday April 9, 2019 - sat-20190409-t/c
Tuesday April 23, 2019 - sat-20190423-t/c
PSAT/NMSQTยฎ
Wednesday October 10, 2018 - pn-20191010-c
Saturday October 13, 2018 - pn-20191013-c
Wednesday October 24, 2018 - pn-20191024-c
PSATโ„ข 10
February 2019 - March 2019 | One order allowed - p10-20190306/various-c
April 2019 | One order allowed - p10-20190415/various-c
PSATโ„ข 8/9
September 2018 - January 2019 | Up to 13 orders allowed - p89-20180925/various-c
February 2019 - March 2019 | One order allowed - p89-20190306/various-c
April 2019 | One order allowed - p89-20190415/various-c
*
* TY18-19 SKUS
SAT School Day
Subtotal SAT without Essay (Rounded Up) 35
Subtotal SAT with Essay (Rounded Up) 35
Student Guides 70
Coordinator Manuals 4
Fee reduction benefits needed this year 15
PSAT/NMSQTยฎ
TOTAL Standard Tests (Rounded Up) 75
Student Guides 75
Coordinator Manuals 3
Fee waivers needed this year 10
PSATโ„ข 10
TOTAL Standard Tests (Rounded Up) 130
Student Guides 130
Coordinator Manuals 6
PSATโ„ข 8/9
TOTAL Standard Tests (Rounded Up) 80
Coordinator Manuals 4
14 pt test book - - 5 - -
Braille Test - - - - 3
Assistive Technology Compatible Test Format Digital test form, delivered on a flash drive, for use with screen-readers and other assistive technology. 2 - - - -
SSD Coordinator Manuals 6
* Return Patterns expected (before WAP-715)
* satsd-s18
* p10-s18
* p89-s18
* p89-f17
*
* Return Patterns in NSAT
* psatnm-2016-fall
* psatnm-2015-fall
* psat10-2017-spring
* psat89-2016-fall
* psat10-2016-spring
* psat89-2017-spring
* psat89-2015-fall
* psat89-2016-spring
* satne-201724
* satwe-201743
*
* Return Patterns expected (after WAP-715)
* sat-20181010-t
* sat-20190319-c
* pn-20191010-t
* p10-20190306-c
* p89-20190415-t
*
* Serialize Pattern expected (after WAP-715
* sat330355s19
* sat330355f18
* p89330355s19
*/
},"storeLength":"session"},
"Data - Widget Display": {"customJS":function(){
/**
* Created by jbeach on 2018-06-12
* Updated by jbeach on 2018-11-13
*/
var ruleName='KIWI: Data Element > Data - Widget Display';
kiwi = window.kiwi || {};
kiwi.util = kiwi.util || {};
kiwi.util.processNavElements = kiwi.util.processNavElements || function() {_satellite.notify('Missing function: kiwi.util.processNavElements!');};
var result = { hasData: false },
oConfig = _satellite.getVar('Kiwi Config - Widgets'),
arrNavVals = [],
arrPromoVals = [],
siteVal = _satellite.getVar('Site Code'),
widgetVal = '',
screenVal = '',
drawerVal = '',
codeVal = '',
anyDrawerIsActive = false,
hasData = false,
widgetScreen = '';
_satellite.notify(ruleName+': starting to process widget promos/navs on page');
//loop map widget objects
Object.keys(oConfig).forEach(function(keyWidget) {//loop1
//_satellite.notify(ruleName+': -START Widget ---------------------------------------------------------------------');
var oWidget = this[keyWidget];
//_satellite.notify(ruleName+': Inside Config Object: oWidget = ' + keyWidget);
widgetVal = keyWidget;
if(oWidget.trackAs) {
widgetVal = oWidget.trackAs;
//_satellite.notify(ruleName+': Inside Config Object: oWidget.trackAs = ' + oWidget.trackAs);
//_satellite.notify(ruleName+': widgetVal = ' + widgetVal);
}
if (oWidget.selector) {
//_satellite.notify(ruleName+': Inside Config Object: oWidget.selector = ' + oWidget.selector);
var elWidget = document.querySelector(oWidget.selector),
oWidgetScreens = oWidget.screens;
if (elWidget && oWidgetScreens) {
Object.keys(oWidgetScreens).forEach(function(keyScreen) {//loop2
//_satellite.notify(ruleName+': ---START Screen ---------------------------------------------------------');
var oScreen = this[keyScreen];
//_satellite.notify(ruleName+': Inside Config Object: oScreen = ' + keyScreen);
screenVal = keyScreen;
if(oScreen.trackAs) {
screenVal = oScreen.trackAs;
//_satellite.notify(ruleName+': Inside Config Object: oScreen.trackAs = ' + oScreen.trackAs);
//_satellite.notify(ruleName+': screenVal = ' + screenVal);
}
if (oScreen.selector) {
//_satellite.notify(ruleName+': Inside Config Object: oScreen.selector = ' + oScreen.selector);
var elScreen = elWidget.querySelector(oScreen.selector),
screenIsInDom = false;
if (elScreen) {
screenIsInDom = true;
if (oScreen.limiter) {
//_satellite.notify(ruleName+': Inside Config Object: oScreen.limiter = ' + oScreen.limiter);
var elLimiter = elScreen.querySelector(oScreen.limiter);
screenIsInDom = !!(elLimiter);
}
}
if (screenIsInDom) {
hasData = true;
widgetScreen = widgetVal + '-' + screenVal;
var oPromos = oScreen.promos,
oNavs = oScreen.navs,
oDrawers = oScreen.drawers;
if (oNavs) {
Object.keys(oNavs).forEach(function(keyNav) {//loop3
//_satellite.notify(ruleName+': -----START Screen Navs ---------------------------------------------------------');
var oNav = this[keyNav],
navKeyVal = widgetVal + '-' + keyNav;
//_satellite.notify(ruleName+': Inside Config Object: oNav = ' + navKeyVal);
if (oNav.selectors) {
var arrSelectors = oNav.selectors,
arrNavs = [],
navElsSelector = '';
if (arrSelectors.length) { //e.g. '.cb-site-navigation', '.lv-globalHeader-widget'
//_satellite.notify(ruleName+': Inside Config Object: arrSelectors = ' + arrSelectors);
for (var j = 0; j < arrSelectors.length; j++) {
arrNavs.push(arrSelectors[j]);
}
navElsSelector = arrNavs.join(',');
}
var navEls = navElsSelector?elScreen.querySelectorAll(navElsSelector):[elScreen];
//process Nav Elements in DOM and add to returned vals
var processedNavViewEvent = kiwi.util.processNavElements(navEls,
'widget-'+navKeyVal,
oNav.navType,
oNav.trackViewEvent,
oNav.trackClickEvent,
oNav.subNavs);
if(processedNavViewEvent && processedNavViewEvent.length) arrNavVals.push(processedNavViewEvent);
}
//_satellite.notify(ruleName+': ------END Screen Navs -----------------------------------------------------------');
},oNavs);
}
if (oPromos) {
if (!oDrawers) {//just promos
Object.keys(oPromos).forEach(function(keyPromo) {//loop4
//_satellite.notify(ruleName+': -----START Screen Promos ---------------------------------------------------------');
//_satellite.notify(ruleName+': Inside Config Object: oPromo = ' + keyPromo);
codeVal = keyPromo;
var elPromo = elScreen.querySelector(this[keyPromo]);
if (elPromo) {
var fullPromoCode = kiwi.util.cleanStringParts(siteVal) + '|' +
kiwi.util.cleanStringParts('widget-'+widgetVal) + ':' +
kiwi.util.cleanStringParts(screenVal) + '|' +
kiwi.util.cleanStringParts(codeVal);
arrPromoVals.push(fullPromoCode);
//_satellite.notify(ruleName+': Pushing Promo View: fullPromoCode = ' + fullPromoCode);
//wire click tracking
elPromo.setAttribute('data-cb-widgetpromo',fullPromoCode);
}
//_satellite.notify(ruleName+': ------END Screen Promos -----------------------------------------------------------');
},oPromos);
} else {
Object.keys(oDrawers).forEach(function(keyDrawer) {//loop5
//_satellite.notify(ruleName+': ------START Drawers ---------------------------------------------------------');
drawerVal = screenVal + '-' + keyDrawer;
var oDrawer = this[keyDrawer];
//_satellite.notify(ruleName+': Inside Config Object: oDrawer = ' + keyDrawer);
if (oDrawer.selector) {
//_satellite.notify(ruleName+': Inside Config Object: oDrawer.selector = ' + oDrawer.selector);
//Wire Drawer Trigger Tracking
var elTrigger = elScreen.querySelector(oDrawer.trigger);
if (elTrigger) {
elTrigger.setAttribute('data-cb-widgetdrawer','');
}
//Wire Drawer Promo Tracking
var elDrawer = elScreen.querySelector(oDrawer.selector),
oPromos = oDrawer.promos;
if (elDrawer && oPromos) {
if ((elDrawer.classList.contains('lv-active'))) { //thisDrawerIsActive
anyDrawerIsActive = true;
widgetScreen = widgetVal + '-' + drawerVal;
Object.keys(oPromos).forEach(function(keyDrawerPromo) {//loop6
//_satellite.notify(ruleName+': --------START Drawer Promos ---------------------------------------------------------');
//_satellite.notify(ruleName+': Inside Config Object: oDrawerPromo = ' + keyDrawerPromo);
codeVal = keyDrawerPromo;
var elPromo = elDrawer.querySelector(this[keyDrawerPromo]);
if (elPromo && !!(elPromo.offsetParent)) {//promoIsVisible
var fullPromoCode = kiwi.util.cleanStringParts(siteVal) + '|' +
kiwi.util.cleanStringParts('widget-'+widgetVal) + ':' +
kiwi.util.cleanStringParts(drawerVal) + '|' +
kiwi.util.cleanStringParts(codeVal);
arrPromoVals.push(fullPromoCode);
//_satellite.notify(ruleName+': Pushing Promo View: fullPromoCode = ' + fullPromoCode);
//wire click tracking
elPromo.setAttribute('data-cb-widgetpromo',fullPromoCode);
}
//_satellite.notify(ruleName+': --------END Drawer Promos -----------------------------------------------------------');
},oPromos);
}
}
}
//_satellite.notify(ruleName+': ------END Drawers -----------------------------------------------------------');
},oDrawers);
if (!anyDrawerIsActive) {
Object.keys(oPromos).forEach(function(keyPromo) {//loop7
//_satellite.notify(ruleName+': -----START Screen Promos ---------------------------------------------------------');
//_satellite.notify(ruleName+': Inside Config Object: oPromo = ' + keyPromo);
codeVal = keyPromo;
var elPromo = elScreen.querySelector(this[keyPromo]);
if (elPromo) {
var fullPromoCode = kiwi.util.cleanStringParts(siteVal) + '|' +
kiwi.util.cleanStringParts('widget-'+widgetVal) + ':' +
kiwi.util.cleanStringParts(screenVal) + '|' +
kiwi.util.cleanStringParts(codeVal);
arrPromoVals.push(fullPromoCode);
//_satellite.notify(ruleName+': Pushing Promo View: fullPromoCode = ' + fullPromoCode);
//wire click tracking
elPromo.setAttribute('data-cb-widgetpromo',fullPromoCode);
}
//_satellite.notify(ruleName+': ------END Screen Promos -----------------------------------------------------------');
},oPromos);
}
}
}
}
}
//_satellite.notify(ruleName+': ---END Screen -----------------------------------------------------------');
},oWidgetScreens);
}
}
//_satellite.notify(ruleName+': -END Widget -----------------------------------------------------------------------');
}, oConfig);
result = {
hasData: hasData,
screen: widgetScreen,
promos: arrPromoVals.join(','),
navs: arrNavVals.join(',')
};
if (result.hasData) _satellite.notify(ruleName+': '+ JSON.stringify(result));
return result;
},"storeLength":"pageview"},
"DDL - App Error": {"jsVariable":"kiwi.ddl.appError","storeLength":"pageview"},
"DDL - App ID": {"jsVariable":"kiwi.ddl.appId","storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"DDL - Atlas Widgets": {"jsVariable":"kiwi.ddl.atlas","storeLength":"pageview"},
"DDL - Download": {"jsVariable":"kiwi.ddl.download","storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"DDL - ECommerce - Purchase": {"jsVariable":"kiwi.ddl.eCommerce.purchase","storeLength":"pageview"},
"DDL Events": {"jsVariable":"digitalData.event","storeLength":"pageview"},
"DDL Feature Used": {"customJS":function(){
/**
* Created by jbeach on 2017-01-22
* Updated by jbeach on 2017-04-24
*/
var ruleName='KIWI: Data Element > DDL Feature Used';
var val = '',
ddlEvents = _satellite.getVar('DDL Events');
if (ddlEvents.length) {
for (var i = 0; i < ddlEvents.length; i++) {
var e = ddlEvents[i];
if (
typeof e.eventInfo !== 'undefined'
&& typeof e.eventInfo.eventName !== 'undefined'
&& e.eventInfo.eventName == 'Feature Used'
&& typeof e.attributes !== 'undefined'
&& typeof e.attributes.featureUsed !== 'undefined'
) {
result = e.attributes.featureUsed;
break;
}
}
}
//_satellite.notify(ruleName+': '+ val);
return val;
},"storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"DDL Page Analytics Toggle": {"jsVariable":"digitalData.page.attributes.analyticsToggle","default":"a","storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"DDL - Page - AppViewCode": {"jsVariable":"kiwi.ddl.page.appViewCode","storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"DDL Page Delay Type": {"jsVariable":"digitalData.page.attributes.delayType","storeLength":"pageview"},
"DDL - Page - FlowCode": {"jsVariable":"kiwi.ddl.page.flowCode","storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"DDL Page Name": {"jsVariable":"digitalData.page.pageInfo.pageName","storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"DDL - Page - PageCode": {"jsVariable":"kiwi.ddl.page.pageCode","storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"DDL Page Primary Category": {"jsVariable":"digitalData.page.category.primaryCategory","storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"DDL - Page - SearchData": {"jsVariable":"kiwi.ddl.page.searchData","storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"DDL - PSAT Score": {"jsVariable":"kiwi.ddl.psatScore","storeLength":"pageview"},
"DDL - PSAT Scores": {"jsVariable":"kiwi.ddl.psatScores","storeLength":"pageview"},
"DDL - SatReg - FeeWaiver": {"jsVariable":"kiwi.ddl.satReg.feeWaiver","default":"none","storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"DDL - SAT Score": {"jsVariable":"kiwi.ddl.satScore","storeLength":"pageview"},
"DDL - SAT Scores": {"jsVariable":"kiwi.ddl.satScores","storeLength":"pageview"},
"DDL - SAT Score Sends": {"jsVariable":"kiwi.ddl.satScoreSends","storeLength":"pageview"},
"DDL Search Results Data": {"customJS":function(){
/**
* Created by jbeach on 2017-03-09
* Updated by jbeach on 2019-10-28
*/
var ruleName='Data Element > DDL Search Results Data';
var val = {
type: '',
term: '',
count: ''
};
if (typeof digitalData != 'undefined' &&
digitalData.page &&
digitalData.page.pageInfo &&
digitalData.page.pageInfo) {
val = {
type: digitalData.page.pageInfo.onsiteSearchType || '',
term: digitalData.page.pageInfo.onsiteSearchTerm || '',
searchResultsCount: digitalData.page.pageInfo.onsiteSearchResult || ''
};
}
//_satellite.notify(ruleName+': '+JSON.stringify(result));
return val;
},"storeLength":"pageview"},
"DDL Target Mods Complete": {"jsVariable":"digitalData.page.attributes.targetModsComplete","storeLength":"pageview"},
"DDL - User - LIFW Status": {"customJS":function(){
cbTrackData = window.cbTrackData || {};
kiwi = window.kiwi || {};
kiwi._thisPage = kiwi._thisPage || {};
kiwi.ddl = kiwi.ddl || {};
kiwi.ddl.user = kiwi.ddl.user || {};
var val = '',
sc = kiwi._thisPage.siteCode || false,
fc = kiwi._thisPage.flowCode || false;
if (sc && sc.match(/^nsat/i) && fc && fc.match(/^send-scores:/i)) {
val = 'fw:';
kiwi.ddl.user.feeWaivers = kiwi.ddl.user.feeWaivers || {};
kiwi.ddl.user.feeWaivers.qualifiedThru = kiwi.ddl.user.feeWaivers.qualifiedThru || false;
if (kiwi.ddl.user.feeWaivers.qualifiedThru) {
val += kiwi.ddl.user.feeWaivers.qualifiedThru;
} else {
val += 'none'
}
val += ' (' + sc + ':' + fc + ')';
}
return val;
},"storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"DDL - User Role": {"customJS":function(){
/**
* Created by jbeach on 2017-02-13
* Updated by jbeach on 2019-06-13
*/
cbTrackData = window.cbTrackData || {};
digitalData = window.digitalData || {};
digitalData.user = digitalData.user || [];
kiwi = window.kiwi || {};
kiwi.ddl = kiwi.ddl || {};
kiwi.ddl.user = kiwi.ddl.user || {};
//var ruleName='KIWI: Data Element > DDL - User Role';
var val = kiwi.ddl.user.role;
if (!val) {
val = cbTrackData.userRole;
if (!val) {
val = cbTrackData.userType;
}
}
if (!val &&
digitalData.user[0] &&
digitalData.user[0].segment) {
val = digitalData.user[0].segment; //HEDR TODO: deprecate this schema and update HEDR app to new one
}
//if (val) _satellite.notify(ruleName+': ('+valSrc+') '+ val);
return val;
},"storeLength":"pageview","cleanText":true},
"DDL Users": {"jsVariable":"digitalData.user","storeLength":"pageview"},
"Derived Education Period Code": {"customJS":function(){
/**
* Created by jbeach on 2017-08-02
* Updated by jbeach on 2018-01-19
*/
//var ruleName='KIWI: Data Element > Derived Education Period Code';
//Gets the current school year ordinal starting at SY1999-2000 = 01
//e.g. School Year 2017-2018 = 19
//School Year range is July - June
var val = '',
today = new Date(), //according to system settings
year = today.getUTCFullYear().toString(), //2017
month = today.getUTCMonth(); // 0-11
//first half
val = year.slice(-2);
//second half
if (month >= 7) val = parseInt(val, 10) + 1;
//add one ordinal
val = parseInt(val, 10) + 1;
//_satellite.notify(ruleName+': '+ val);
return val;
},"default":"00","storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"Derived Page Code": {"customJS":function(){
/**
* Created by jbeach on 2017-01-22
* Updated by jbeach on 2018-10-22
*/
kiwi = window.kiwi || {};
kiwi.util = kiwi.util || {};
kiwi.util.pageNameHelpers = kiwi.util.pageNameHelpers || {};
kiwi._thisPage = kiwi._thisPage || {};
kiwi._thisPage.siteSettings = kiwi._thisPage.siteSettings || {};
//var ruleName='KIWI: Data Element > Derived Page Code';
var val = '',
href = kiwi._urlToParse || document.location.href;
val = kiwi.util.pageNameHelpers.getPageName(href);
val = decodeURI(val);//.toLowerCase();
val = kiwi.util.pageNameHelpers.repl(val, 'VignetteServlet.srv', ''); //remove vignette prefix from pagename //TODO: check URL report for examples of VignetteServlet.srv
val = kiwi.util.pageNameHelpers.repl(val, '?relativePath=', ''); //remove ?relativePath= from pagename //TODO: check URL report for examples of ?relativePath=
if (val.match(/.*(\?)$/)) {
val = kiwi.util.pageNameHelpers.repl(val, '?', ''); //remove final ? from pagename
}
if (kiwi.util.pageNameHelpers.hashStr) {
_satellite.setVar('Derived Page Hash', kiwi.util.pageNameHelpers.hashStr);
}
if (!val) val = 'home';
//_satellite.notify(ruleName+': '+ val);
return val;
},"storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"Derived Page Name": {"customJS":function(){
/**
* Created by jbeach on 2017-01-30
* Updated by jbeach on 2019-10-30
*/
//var ruleName='KIWI: Data Element > Derived Page Name';
var val = '';
val = _satellite.getVar('Derived Site Code');
if (_satellite.getVar('Derived Page Code')) val += '/' + _satellite.getVar('Derived Page Code');
if (!kiwi._urlToParse && _satellite.getVar('DDL - Page - AppViewCode')) {
val += ':' + _satellite.getVar('DDL - Page - AppViewCode');
}
//_satellite.notify(ruleName+': '+ val);
return val;
},"storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"Derived Site Code": {"customJS":function(){
/**
* Created by jbeach on 2017-01-21
* Updated by jbeach on 2018-01-24
*/
kiwi = window.kiwi || {};
//var ruleName='KIWI: Data Element > Derived Site Code';
var val = '',
href = kiwi._urlToParse || document.location.href;
// Derive From Subdomain
if (href) {
var l = document.createElement('a');
l.href = href;
val = l.hostname || '';
} else {
val = _satellite.getVar('Subdomain');
}
if (val.match(/^collegeboard\.(com|org)$/gi)) {val='www';} //handle homeorg base
else if (val.match(/\.(cbaccount\.org)$/gi)) { //handle IAM cbaccount
if (document.location.pathname.match(/^\/professional\//gi)) val='cbaccount-professional';
}
else if (val.match(/\.(springboardonline\.org)$/gi)) {val='springboardonline.org';} //handle springboard digital
else {val = val.replace(/\.(collegeboard\.com|collegeboard\.org)$/gi, '');}//drop domain
//_satellite.notify(ruleName+': '+ val);
return val;
},"storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"Derived Widget Selectors": {"customJS":function(){
/**
* Created by jbeach on 2018-11-14
* Updated by jbeach on 2019-01-16
*/
var ruleName='KIWI: Data Element > Derived Widget Selectors';
var val = {};
var atlas = _satellite.getVar('AppData Widgets');
if (typeof atlas !== 'undefined' && atlas !== '') {
//loop atlas object
Object.keys(atlas).forEach(function (key) { //widget loop
var arrInstances = this[key],
widgetKey = key, //e.g. 'header'
arrSelectors = []; //e.g. 'cb-atlas-header-1,cb-atlas-header-2'
//loop array of instances
(function(){
for (var i = 0; i < arrInstances.length; i++) {
if (arrInstances[i].id) arrSelectors.push('#'+arrInstances[i].id);
}
})();
val[widgetKey] = arrSelectors;
}, atlas);
}
if (Object.keys(val).length !== 0) _satellite.notify(ruleName+': '+ JSON.stringify(val));
return val;
},"storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"Domain": {"customJS":function(){
/**
* Created by jbeach on 2016-xx
* Updated by jbeach on 2019-04-04
*/
//var ruleName='KIWI: Data Element > Domain';
//var valSrc = 'Browser';
var val = window.document.location.hostname.toString(),
arrVal = /([\w-]+\.[\w-]{2,3})$/i.exec(val);
if (arrVal && arrVal[1]) {
val = arrVal[1];
}
//if (val) _satellite.notify(ruleName+': ('+valSrc+') '+ val);
return val;
},"storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"DOM - Alert Text - Danger": {"selector":".alert-danger.cb-alert-heading h2, .alert-danger.cb-alert-heading h3, .alert-danger.cb-alert-heading h4","property":"text","storeLength":"pageview"},
"DOM - Alert Text - Warning": {"selector":".alert-warning.cb-alert-heading h2, .alert-warning.cb-alert-heading h3, .alert-warning.cb-alert-heading h4","property":"text","storeLength":"pageview"},
"DOM Browser Width": {"customJS":function(){
/**
* Taken from Jan Exner https://webanalyticsfordevelopers.com/2017/09/05/useful-data-elements/
* Created by jbeach on 2017-12-22
* Updated
*/
//var ruleName='KIWI: Data Element > DOM Browser Width';
var val = '',
cw = -1;
if (typeof document !== 'undefined' && document && typeof document.documentElement !== 'undefined' && document.documentElement) {
cw = document.documentElement.clientWidth;
}
var iw = -1;
if (typeof window !== 'undefined' && window) {
iw = window.innerWidth;
}
val = cw < iw ? iw : cw;
//_satellite.notify(ruleName+': '+ val);
return val;
},"storeLength":"pageview"},
"DOM h1 text lower": {"selector":"h1","property":"text","storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"DOM - iam-page Node": {"selector":".iam-page","property":"className","storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"DOM Mod - LV Lookup Widget": {"selector":"div.lv-lookup-widget .lv-list","property":"innerHTML","storeLength":"pageview"},
"DOM Mod - Resources Filter": {"selector":"div.view[class*=\"resources\"] .cb-resource","property":"innerHTML","storeLength":"pageview"},
"DOM nsat AdmissionTicketTestType": {"selector":"#AdmissionTicketTestType","property":"text","storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"DOM nsat TestTypeId": {"selector":"#TestTypeId","property":"text","storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"DOM Test Order Admin Text": {"selector":"#rightSideWidget-fixed \u003e .test-name","property":"text","storeLength":"pageview","cleanText":true},
"DOM Test Order Date Text": {"selector":"#rightSideWidget-fixed \u003e .test-date","property":"text","storeLength":"pageview","cleanText":true},
"DOM Test Order School Text": {"selector":"#rightSideWidget-fixed \u003e .school-name","property":"text","storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"Enterprise Widgets Version": {"customJS":function(){
/**
* Created by jbeach on 2017-07-13
* Updated by jbeach on 2019-07-11
*/
//var ruleName='KIWI: Data Element > Enterprise Widgets Version';
var val = '',
pageScripts = document.scripts,
reMangojs = /\/\/mango\.collegeboard\.org\/cbmango1\/(.*)\/all\.js/i,
reAtlasjs = /\/\/atlas\.collegeboard\.org\/widgets\/release\/(.*)\/main\.js/i,
reWidgetsDevjs = /\/\/widgets\.fed-nonprod\.collegeboard\.org\/develop\/widgets\/main\.js/i,
ref,
hasMango = false,
hasAtlas = false,
hasAtlasDev = false;
for (var i = 0; i < pageScripts.length; i++) {
ref = pageScripts[i].src;
if(ref.match(reMangojs)) {
val = reMangojs.exec(ref)[1];
hasMango = true;
}
if(ref.match(reAtlasjs)) {
val = reAtlasjs.exec(ref)[1];
hasAtlas = true;
}
if(ref.match(reWidgetsDevjs)) {
val = reWidgetsDevjs.exec(ref)[1];
hasAtlasDev = true;
}
if (hasMango || hasAtlas) break;
}
if (hasMango) val = 'mango:' + val;
if (hasAtlas) val = 'atlas:' + val;
if (hasAtlasDev) val = 'atlas:dev-bundle';
if (!val) val = 'widgets-library-not-found';
//if (val) _satellite.notify(ruleName+': ('+valSrc+') '+ val);
return val;
},"storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"External Campaign ID": {"queryParam":"excmpid","storeLength":"pageview","forceLowerCase":true,"cleanText":true,"ignoreCase":1},
"Feature Clicks - Accordion": {"customJS":function(){
/**
* Created by jbeach on 2019-01-23
* Updated by jbeach on 2019-05-06
*/
kiwi = window.kiwi || {};
kiwi.util = kiwi.util || {};
kiwi.util.getFeatureText = kiwi.util.getFeatureText || function() {_satellite.notify('Missing function: kiwi.util.getFeatureText()');};
//var ruleName='Data Element > Feature Clicks - Accordion';
var val = {
hasData: false,
featureType: 'accordion',
featureName: '',
featureOptions: '',
linkTypes: ''
},
//valSrc = '',
element = kiwi._elementToTest || false;
if (element) {
var linktype = element.getAttribute('data-cbtrack-linktype') || '',
accordionEl = element.closest('[data-cbtrack-accordion]');
if (accordionEl) {
//valSrc = 'DOM Scrape';
val.hasData = true;
val.featureName = accordionEl.getAttribute('data-cbtrack-accordion');
val.linkTypes = linktype;
//construct feature options name detail
var linkname = kiwi.util.getFeatureText(element);
val.featureOptions += linkname;
}
}
//if (val) _satellite.notify(ruleName+': ('+valSrc+') '+ JSON.stringify(val));
return val;
/* Developing for:
event242 - Feature Views (set once per feature+visit), tracked with:
pageName - Page (e.g. Feature Host Page)
prop43 - (Feature Name) Feature Used ("accordion:[ name of accordion ]")
event243 - Feature Clicks (set once per feature use), tracked with:
pev2 - Custom Link ("Feature Used - Accordion")
prop25 - Page Sending Custom Link (e.g. Feature Host Page)
prop43 - (Feature Name) Feature Used ("accordion:[ name of accordion ]")
prop29 - Feature Options Used ("panel=[ link text ],...n") - List Variable Enabled, separator = ",", clean text of commas, equal signs before storing
prop30 - Feature Repeat Use Count (+1 each time feature use+visit occurs)
*/
//accordion container = document.querySelectorAll('.cb-accordion');
//nearest heading = container.closest('h2, h3, h4, h5, h6') || document.querySelector('h1');
//feature name = kiwi.util.scrapeDomName(heading, '(,|=)').toLowerCase();
//apricot 3.3.0 ACCORDION CONTAINER = .cb-accordion
//apricot 3.3.0 ACCORDION OPTION = .cb-accordion .panel-heading a
//apricot 3.3.0 ACCORDION EXPAND ALL = .cb-accordion .cb-accordion-btn.expand-all
//https://collegereadiness.collegeboard.org/sat/k12-educators/sat-school-day/timeline
//https://uihub.wcm.collegeboard.org/ui/3.3.0/accordion/
},"storeLength":"pageview"},
"Feature Clicks - Crosslink": {"customJS":function(){
/**
* Created by jbeach on 2019-04-12
* Updated by jbeach on 2019-05-06
*/
kiwi = window.kiwi || {};
kiwi.util = kiwi.util || {};
//var ruleName='Data Element > Feature Clicks - Crosslink';
var val = {
hasData: false,
featureType: 'crosslink',
featureName: '',
featureOptions: '',
linkTypes: ''
},
//valSrc = '',
element = kiwi._elementToTest || false;
if (element) {
var linktype = element.getAttribute('data-cbtrack-linktype') || '',
crosslinkEl = element.closest('[data-cbtrack-crosslink]');
if (crosslinkEl) {
//valSrc = 'DOM Scrape';
val.hasData = true;
val.featureName = crosslinkEl.getAttribute('data-cbtrack-crosslink');
val.linkTypes = linktype;
//construct feature options name detail
var parentId = element.closest('[id]').id;
val.featureOptions += parentId;
}
}
//if (val) _satellite.notify(ruleName+': ('+valSrc+') '+ JSON.stringify(val));
return val;
/* Developing for:
event243 - Feature Clicks (set once per feature use), tracked with:
pev2 - Custom Link ("Feature Used - crosslink")
prop25 - Page Sending Custom Link (e.g. Feature Host Page)
prop43 - (Feature Name) Feature Used ("crosslink:[ name of crosslink ]")
prop29 - Feature Options Used (activity map region?) - List Variable Enabled, separator = ",", clean text of commas, equal signs before storing
prop30 - Feature Repeat Use Count (+1 each time feature use+visit occurs)
*/
//crosslink element = document.querySelectorAll('[data-cbtrack-linktype*="crosslink"]');
//feature name = kiwi.util.scrapeDomName(crosslink element, '(,|=)').toLowerCase();
//DRUPAL 8 crosslink attribute:
//https://apstudent-dev.collegeboard.org/node/56
/*
<div class="col-md-offset-2 col-md-8 col-xs-12">
<h2 id="dialogTitle">Not a Student?</h2>
<p id="dialogDesc"><a data-cbtrack-linktype="crosslink" href="http://apcentral.collegeboard.org">Go to AP Central</a> for resources for teachers, administrators, and coordinators.</p>
</div>
*/
},"storeLength":"pageview"},
"Feature Clicks - CTA Card": {"customJS":function(){
/**
* Created by jbeach on 2019-05-02
* Updated by jbeach on 2019-05-18
*/
kiwi = window.kiwi || {};
kiwi.util = kiwi.util || {};
//var ruleName='Data Element > Feature Clicks - CTA Card';
var featId = 'ctacard',
val = {
hasData: false,
featureType: featId,
featureName: '',
featureOptions: '',
linkTypes: 'promo'
},
clicked = kiwi._elementToTest || false;
if (clicked) {
var element = clicked.closest('[data-cbtrack-'+featId+']');
if (element) {
val.hasData = true;
val.featureName = element.getAttribute('data-cbtrack-'+featId);
//construct feature options name detail
var linkName = kiwi.util.getFeatureText(clicked);
val.featureOptions += linkName;
}
}
//if (val) _satellite.notify(ruleName+': ('+valSrc+') '+ JSON.stringify(val));
return val;
},"storeLength":"pageview"},
"Feature Clicks - Custom": {"customJS":function(){
/**
* Created by jbeach on 2019-03-25
* Updated by jbeach on 2019-05-06
*/
kiwi = window.kiwi || {};
kiwi.util = kiwi.util || {};
var ruleName='KIWI: Data Element > Feature Clicks - Custom';
var val = {
hasData: false,
featureType: 'custom',
featureName: '',
featureOptions: '',
linkTypes: ''
},
valSrc = '',
element = kiwi._elementToTest || false;
if (element) {
valSrc = 'DOM Scrape';
//Dismiss or Submit?
var isDismiss = (element.id === 'fwEligibilityModal'), //modal
isSubmit = (element.id === 's2-fwEligibilitymodal-continueButton'); //submit button
if(isDismiss || isSubmit) {
val.hasData = true,
val.featureName = 'fw-eligibility-modal';
val.featureOptions = isDismiss?'dismiss modal/ask again':'';
if (isSubmit) {
var modal = element.closest('[data-cbtrack-custom]');
if (modal) {
var fields = modal.querySelectorAll('[name="FwEligibilityOptIn"]'),
option = '';
for (var i = 0; i < fields.length; i++) {
if (fields[i].checked) option = fields[i].value;
}
switch (option) {
case 'Accepted':
val.featureOptions = 'benefits accepted';
break;
case 'NotAccepted':
val.featureOptions = 'benefits declined';
break;
case 'AskAgain':
val.featureOptions = 'dismiss modal/ask again';
break;
default:
break;
}
}
}
}
}
if (val) _satellite.notify(ruleName+': ('+valSrc+') '+ JSON.stringify(val));
return val;
/* Developing for:
event242 - Feature Views (set once per feature+visit), tracked with:
pageName - Page (e.g. Filter Host Page)
prop43 - (Feature Type + Feature Name) Feature Used ("custom:[ name of feature ]")
event243 - Feature Interactions (set once per feature option+visit), tracked with:
pev2 - Custom Link ("Feature Used - Custom")
prop25 - Page Sending Custom Link (e.g. Feature Host Page)
prop43 - (Feature Name) Feature Used ("custom:[ name of feature ]")
prop29 - Feature Options Used - List Variable Enabled, separator = ",", clean text of commas, equal signs before storing
prop30 - Feature Used Count (+1 each time feature option+visit occurs)
*/
/* Click-A-Student Fee Waiver Benefits Modal Acceptance Tracking Plan:
- on Dismiss of #fwEligibilityModal or Submit of #fwEligibility
- Track Fee Waiver Benefit Accept Option [name="FwEligibilityOptIn"]
- either YES: #fwEligibilityOptYes/[value="Accepted"]
- or NO: #fwEligibilityOptNo/[value="NotAccepted"]
- or DEFER: #fwEligibilityOptAskagain/[value="AskAgain"] OR
Modal Dismiss without Form Submit
<div id="fwEligibilityModal" class="modal fade cb-modal-animation in" aria-labelledby="fwEligibilityModalLabel" aria-hidden="true" role="dialog" aria-modal="true">
<div class="modal-dialog cb-modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close s2-close" data-dismiss="modal"><span aria-hidden="true">X</span><span class="sr-only">Close Fee Waiver Popup</span></button>
<h3 class="modal-title">Hi <span>Laurie</span></h3>
</div>
<div class="modal-body">
<div class="clearfix"><p> Are you eligible and do you want to receive the SAT fee waiver benefits?</p></div>
<form id="fwEligibility" name="fwEligibility" method="post" action="updateFeeWaiverOptInAction.action" role="form">
<div class="radio">
<label for="fwEligibilityOptYes">
<input type="radio" id="fwEligibilityOptYes" name="FwEligibilityOptIn" value="Accepted" data-cb-element="no-cb" class="cb-radio"><span class="cb-span"></span>
Yes, I am eligible for fee waiver benefits. By saying yes, I understand that colleges and universities will use this data to provide me with College Application Fee
Waivers and other benefits for low-income students on campus.
</label>
</div>
<div class="radio">
<label for="fwEligibilityOptNo">
<input type="radio" id="fwEligibilityOptNo" name="FwEligibilityOptIn" value="NotAccepted" data-cb-element="no-cb" class="cb-radio"><span class="cb-span"></span>
No, I am not interested or eligible to receive fee waiver benefits.
</label>
</div>
<div class="radio">
<label for="fwEligibilityOptAskagain">
<input type="radio" id="fwEligibilityOptAskagain" name="FwEligibilityOptIn" value="AskAgain" data-cb-element="no-cb" class="cb-radio"><span class="cb-span"></span>
Ask me again later.
</label>
</div>
</form>
</div>
<div class="modal-footer">
<input id="s2-fwEligibilitymodal-continueButton" name="continue" class="s2-btn btn btn-primary" type="submit" value="Continue">
</div>
</div>
</div>
</div>
*/
},"storeLength":"pageview"},
"Feature Clicks - Event Card": {"customJS":function(){
/**
* Created by jbeach on 2019-05-18
* Updated by jbeach on 2019-05-18
*/
kiwi = window.kiwi || {};
kiwi.util = kiwi.util || {};
kiwi.util.getFeatureText = kiwi.util.getFeatureText || function() {_satellite.notify('Missing function: kiwi.util.getFeatureText()');};
//var ruleName='Data Element > Feature Clicks - Event Card';
var featId = 'ec',
val = {
hasData: false,
featureType: featId,
featureName: '',
featureOptions: '',
linkTypes: ''
},
clicked = kiwi._elementToTest || false;
if (clicked) {
var element = clicked.closest('[data-cbtrack-'+featId+']');
if (element) {
var linktype = element.getAttribute('data-cbtrack-linktype') || '';
val.hasData = true;
val.featureName = element.getAttribute('data-cbtrack-'+featId);
val.linkTypes = linktype;
//construct feature options name detail
var ueName = clicked.closest('.cb-event-info').closest('li').querySelector('.cb-event-title') || '';
var linkName = kiwi.util.getFeatureText(ueName) + ':' + kiwi.util.getFeatureText(clicked);
val.featureOptions += linkName;
}
}
//if (val) _satellite.notify(ruleName+': '+ JSON.stringify(val));
return val;
/* Developing for:
https://wiki.collegeboardnewmedia.org/display/wa/Features+Tracking
https://uihub.wcm.collegeboard.org/ui/3.4.0/eventCards/
*/
},"storeLength":"pageview"},
"Feature Clicks - Feature": {"customJS":function(){
//var ruleName='Data Element > Feature Clicks - Feature';
var featId = 'feature',
val = {
hasData: false,
featureType: '',
featureName: '',
featureOptions: '',
linkTypes: ''
},
clickedEl = kiwi._elementToTest || false;
if (clickedEl) {
var featureEl = clickedEl.closest('[data-cbtrack-'+featId+']');
val.hasData = true;
val.featureType = featureEl.getAttribute('data-kiwi-feature');
val.featureName = featureEl.getAttribute('data-kiwi-'+val.featureType);
val.featureOptions = clickedEl.getAttribute('data-kiwi-featureclick');
if (clickedEl.hasAttribute('data-cbtrack-promo')) {
val.linkTypes = 'promo';
}
}
return val;
},"storeLength":"pageview"},
"Feature Clicks - Filter": {"customJS":function(){
/**
* Created by jbeach on 2019-01-16
* Updated by jbeach on 2019-05-06
*/
kiwi = window.kiwi || {};
kiwi.util = kiwi.util || {};
kiwi.util.getFeatureText = kiwi.util.getFeatureText || function() {_satellite.notify('Missing function: kiwi.util.getFeatureText()');};
//var ruleName='Data Element > Feature Clicks - Filter';
var val = {
hasData: false,
featureType: 'filter',
featureName: '',
featureOptions: '',
linkTypes: ''
},
//valSrc = '',
element = kiwi._elementToTest || false;
if (element) {
var optionsContainer = element.querySelector('.cb-filter-options, form'),
selects,
texts,
arrFilters = [];
if (optionsContainer) {
var filterEl = element.closest('[data-cbtrack-filter]');
if (filterEl) {
//valSrc = 'DOM Scrape';
val.hasData = true;
val.featureName = filterEl.getAttribute('data-cbtrack-filter');
selects = optionsContainer.querySelectorAll('select');
for (var i = 0; i<selects.length; i++) {
var selectId = '',
optionName = '',
optionValue = '',
select = selects[i];
selectId = select.getAttribute('id');
optionName = kiwi.util.getFeatureText(optionsContainer.querySelector('label[for="'+selectId+'"]'));
optionName = optionName.replace(/select-(a-)?/i, '');
if (select.nextSibling && select.nextSibling.classList.contains('cb-select')) { //"nextSibling" requires accessibility to be in place
if (select.nextSibling.textContent && !(select.nextSibling.classList.contains('disabled'))) {
optionValue = kiwi.util.getFeatureText(select.nextSibling);
}
} else {
optionValue = kiwi.util.getFeatureText(select.querySelector('option[selected]'));
}
if (optionValue) arrFilters.push(optionName+'='+optionValue);
}
texts = optionsContainer.querySelectorAll('input[type="text"]');
for (var j = 0; j<texts.length; j++) {
var textId = '',
textName = '',
text = texts[j];
textId = text.getAttribute('id');
if (text.value) {
textName = kiwi.util.getFeatureText(optionsContainer.querySelector('label[for="'+textId+'"]'));
textName = textName.replace(/-\(optional\)/i, '');
textName = textName.replace(/enter-a-/i, '');
arrFilters.push(textName);
}
}
//construct feature options name detail
val.featureOptions = arrFilters.join('|');
}
}
}
//if (val) _satellite.notify(ruleName+': ('+valSrc+') '+ JSON.stringify(val));
return val;
/* Developing for:
event242 - Feature Views (set once per feature+visit), tracked with:
pageName - Page (e.g. Feature Host Page)
prop43 - (Feature Name) Feature Used ("accordion:[ name of accordion ]")
event243 - Feature Clicks (set once per feature use), tracked with:
pev2 - Custom Link ("Feature Used - Accordion")
prop25 - Page Sending Custom Link (e.g. Feature Host Page)
prop43 - (Feature Name) Feature Used ("accordion:[ name of accordion ]")
prop29 - Feature Options Used ("panel=[ link text ],...n") - List Variable Enabled, separator = ",", clean text of commas, equal signs before storing
prop30 - Feature Repeat Use Count (+1 each time feature use+visit occurs)
*/
/* Developing for:
event240 - Filter Views (set once per filter+visit), tracked with:
pageName - Page (e.g. Filter Host Page)
prop43 - (Filter Name) Feature Used ("filter:[ name of filter ]")
event241 - Filter Applies (set once per filter submit), tracked with:
pev2 - Custom Link ("Filter Applied")
prop25 - Page Sending Custom Link (e.g. Filter Host Page)
prop43 - (Filter Name) Feature Used ("filter:[ name of filter ]")
prop29 - Filter Options Used ("[ label text ]=[ option text ],...n") - List Variable Enabled, separator = ",", clean text of commas, equal signs before storing
prop30 - Feature Used Count (+1 each time filter submit+visit occurs)
*/
//filter container = document.querySelector('.cb-filter-container, .view-filters');
//nearest filter heading = container.closest('h2, h3, h4, h5, h6') || document.querySelector('h1');
//filter name = kiwi.util.scrapeDomName(heading, '(,|=)').toLowerCase();
//apricot 3.3.0 FILTER CONTAINER = .cb-filter-container
//apricot 3.3.0 FILTER SELECT = .cb-filter-container .cb-filter-options select
//apricot 3.3.0 FILTER OPTION NAME = .cb-filter-container .cb-filter-options >> .find('label[for="' + $select.attr('id') + '"]');
//apricot 3.3.0 FILTER OPTION VALUE = .cb-filter-container .cb-filter-options select >> .find('option:selected').text()
//apricot 3.3.0 FILTER BUTTON = .cb-filter-container .cb-filter-apply
//apricot 3.3.0 FILTER REMOVE = .cb-filter-container .cb-filter-remove
//drupal module FILTER CONTAINER = .view-filters
//drupal module FILTER SELECT = .view-filters form select
//drupal module FILTER OPTION NAME = .view-filters form >> .find('label[for="' + $select.attr('id') + '"]');
//drupal module FILTER OPTION VALUE = .view-filters form select >> .find('option:selected').text()
//drupal module FILTER BUTTON = .view-filters form [type="submit"]
//counselors/resources; aru/resources = .view-filters form [type="submit"]
//lv look up widget = div.lv-lookup-widget .lv-search-box button[name="lv-see-results"]
//els = document.querySelectorAll('div.view[class*="resources"] form button[type="submit"]');
//div.lv-lookup-widget .lv-list
//div.view[class*="resources"] .cb-resource
},"storeLength":"pageview"},
"Feature Clicks - Jump Link": {"customJS":function(){
/**
* Created by jbeach on 2019-02-05
* Updated by jbeach on 2019-05-06
* Notes: BACK TO TOP links will always report under the first Jump Link feature on a page if there are more than one
*/
kiwi = window.kiwi || {};
kiwi.util = kiwi.util || {};
kiwi.util.getFeatureText = kiwi.util.getFeatureText || function() {_satellite.notify('Missing function: kiwi.util.getFeatureText()');};
//var ruleName='Data Element > Feature Clicks - Jump Link';
var val = {
hasData: false,
featureType: 'jumplinks',
featureName: '',
featureOptions: '',
linkTypes: ''
},
//valSrc = '',
element = kiwi._elementToTest || false;
if (element) {
var jumplinksEl = element.closest('[data-cbtrack-jumplinks]');
if (jumplinksEl) {
//valSrc = 'DOM Scrape';
val.hasData = true;
val.featureName = jumplinksEl.getAttribute('data-cbtrack-jumplinks');
//construct feature options name detail
var linkname = kiwi.util.getFeatureText(element);
val.featureOptions += linkname;
}
}
//if (val) _satellite.notify(ruleName+': ('+valSrc+') '+ JSON.stringify(val));
return val;
/* Developing for:
event242 - Feature Views (set once per feature+visit), tracked with:
pageName - Page (e.g. Feature Host Page)
prop43 - (Feature Name) Feature Used ("jumplinks:[ name of jumplinks group ]")
event243 - Feature Clicks (set once per feature use), tracked with:
pev2 - Custom Link ("Feature Used - Jump Links")
prop25 - Page Sending Custom Link (e.g. Feature Host Page)
prop43 - (Feature Name) Feature Used ("jumplinks:[ name of jumplinks group ]")
prop29 - Feature Options Used ("jump=[ link text ]")
prop30 - Feature Repeat Use Count (+1 each time feature use+visit occurs)
*/
//jumplinks container = document.querySelectorAll('.cb-jumplinks-menu');
//apricot 3.3.0 CONTAINER = .cb-jumplinks-menu
//apricot 3.3.0 OPTION = .cb-jumplinks-menu a
//apricot 3.3.0 BACK TO TOP = .cb-jumplinks-container .cb-jumplinks-back
//Drupal CONTAINER = #help-topics + ul
//Drupal OPTION = #help-topics + ul li a
//Drupal BACK TO TOP = a[href="#help-topics"]
//https://opportunity-staging.collegeplanning-nonprod.collegeboard.org/faq
//https://collegereadiness.collegeboard.org/educators/k-12/reporting-portal-help
},"storeLength":"pageview"},
"Feature Clicks - Key Benefits": {"customJS":function(){
/**
* Created by jbeach on 2019-11-19
* Updated by jbeach on 2019-11-19
*/
kiwi = window.kiwi || {};
kiwi.util = kiwi.util || {};
kiwi.util.getFeatureText = kiwi.util.getFeatureText || function() {_satellite.notify('Missing function: kiwi.util.getFeatureText()');};
//var ruleName='Data Element > Feature Clicks - Key Benefits';
var featId = 'keybenefits',
val = {
hasData: false,
featureType: featId,
featureName: '',
featureOptions: '',
linkTypes: ''
},
clicked = kiwi._elementToTest || false;
if (clicked) {
var element = clicked.closest('[data-cbtrack-'+featId+']');
if (element) {
var linktype = element.getAttribute('data-cbtrack-linktype') || '';
if (clicked.hasAttribute('data-cbtrack-promo')) linktype = 'promo';
val.hasData = true;
val.featureName = element.getAttribute('data-cbtrack-'+featId);
val.linkTypes = linktype;
//construct feature options name detail
var section = clicked.closest('.cb-key-benefit').querySelector('.cb-block-title');
if (section) {
var sectionName = kiwi.util.getFeatureText(section);
val.featureOptions += sectionName;
} else {
var linkName = kiwi.util.getFeatureText(clicked);
val.featureOptions += linkName;
}
}
}
//if (val) _satellite.notify(ruleName+': '+ JSON.stringify(val));
return val;
/* Developing for:
https://jira.collegeboard.org/browse/WAP-3506
https://about.collegeboard.org/privacy-center/privacy-statement
.container-flex (with child .cb-key-benefit) = Tracked Feature (walk up to page H1 for text)
.cb-key-benefit .cb-block-title = Feature Option Prefix Text
.cb-key-benefit a = Feature Option clickable element and postpended text
*/
//key-benefits container = document.querySelector('.cb-key-benefit').getClosest('.container-flex');
//nearest heading = container.closest('h2, h3, h4, h5, h6') || document.querySelector('h1');
//feature name = kiwi.util.scrapeDomName(heading, '(,|=)').toLowerCase();
},"storeLength":"pageview"},
"Feature Clicks - Layout Panel": {"customJS":function(){
/**
* Created by jbeach on 2019-05-18
* Updated by jbeach on 2019-05-18
*/
kiwi = window.kiwi || {};
kiwi.util = kiwi.util || {};
kiwi.util.getFeatureText = kiwi.util.getFeatureText || function() {_satellite.notify('Missing function: kiwi.util.getFeatureText()');};
//var ruleName='Data Element > Feature Clicks - Layout Panel';
var featId = 'layp',
val = {
hasData: false,
featureType: featId,
featureName: '',
featureOptions: '',
linkTypes: ''
},
clicked = kiwi._elementToTest || false;
if (clicked) {
var element = clicked.closest('[data-cbtrack-'+featId+']');
if (element) {
var linktype = element.getAttribute('data-cbtrack-linktype') || '';
if (clicked.hasAttribute('data-cbtrack-promo')) linktype = 'promo';
val.hasData = true;
val.featureName = element.getAttribute('data-cbtrack-'+featId);
val.linkTypes = linktype;
//construct feature options name detail
var linkName = kiwi.util.getFeatureText(clicked);
val.featureOptions += linkName;
}
}
//if (val) _satellite.notify(ruleName+': '+ JSON.stringify(val));
return val;
/* Developing for:
https://wiki.collegeboardnewmedia.org/display/wa/Features+Tracking
https://uihub.wcm.collegeboard.org/ui/3.4.0/layoutpanels/
*/
},"storeLength":"pageview"},
"Feature Clicks - Widget": {"customJS":function(){
/**
* Created by jbeach on 2019-03-20
* Updated by jbeach on 2019-11-07
*/
kiwi = window.kiwi || {};
kiwi.util = kiwi.util || {};
kiwi.util.getFeatureText = kiwi.util.getFeatureText || function() {_satellite.notify('Missing function: kiwi.util.getFeatureText()');};
//var ruleName='Data Element > Feature Clicks - Widget';
var featId = 'widget',
val = {
hasData: false,
featureType: featId,
featureName: '',
featureOptions: '',
linkTypes: '',
widgetScreenName: ''
},
clicked = kiwi._elementToTest || false;
if (clicked) {
var linktype = clicked.getAttribute('data-cbtrack-linktype') || '',
element = clicked.closest('[data-cbtrack-widget]');
if (element) {
if (linktype) {
val.featureName = element.getAttribute('data-cbtrack-widget');
val.hasData = true;
val.linkTypes = linktype;
var arrFeatOptions = [],
linkGroupPrefix = '',
linkGroupEl = clicked.closest('[data-cbtrack-linkgroup]'),
linkGroup = linkGroupEl?linkGroupEl.getAttribute('data-cbtrack-linkgroup'):'',
linkName = kiwi.util.getFeatureText(clicked);
//construct feature options name detail
switch (val.featureName) {
case 'header':
linkGroupPrefix = 'gh';
break;
case 'footer':
linkGroupPrefix = 'gf';
break;
case 'identity':
case 'search':
linkGroupPrefix = val.featureName;
var parentWidgetEl = element.parentElement.closest('[data-cbtrack-widget]');
if (parentWidgetEl) {
var parentWidget = parentWidgetEl.getAttribute('data-cbtrack-widget');
switch (parentWidget) {
case 'header':
linkGroupPrefix = 'gh';
break;
case 'footer':
linkGroupPrefix = 'gf';
break;
default:
break;
}
}
break;
case 'bfcl':
val.widgetScreenName = clicked.getAttribute('data-kiwi-widgetscreenname');
break;
default:
break;
}
if (linkGroupPrefix) arrFeatOptions.push(linkGroupPrefix);
if (linkGroup) arrFeatOptions.push(linkGroup);
if (linkGroup !== 'search-sugg') arrFeatOptions.push(linkName);
if (clicked.tagName === 'SELECT') arrFeatOptions.push(kiwi.util.sanitizeString(clicked.options[clicked.selectedIndex].text));
val.featureOptions = arrFeatOptions.join(':');
}
}
}
//if (val) _satellite.notify(ruleName+': ('+valSrc+') '+ JSON.stringify(val));
return val;
/* Developing for:
event242 - Feature Views (set once per feature+visit), tracked with:
pageName - Page (e.g. Feature Host Page)
prop43 - (Feature Name) Feature Used ("accordion:[ name of accordion ]")
event243 - Feature Clicks (set once per feature use), tracked with:
pev2 - Custom Link ("Feature Used - Accordion")
prop25 - Page Sending Custom Link (e.g. Feature Host Page)
prop43 - (Feature Name) Feature Used ("accordion:[ name of accordion ]")
prop29 - Feature Options Used ("panel=[ link text ],...n") - List Variable Enabled, separator = ",", clean text of commas, equal signs before storing
prop30 - Feature Repeat Use Count (+1 each time feature use+visit occurs)
*/
/*
see https://wiki.collegeboardnewmedia.org/display/wa/Atlas+Widgets+WAP+Implementation
DOM ATTRIBUTES:
data-cbtrack-widget
data-cbtrack-linktype
data-cbtrack-linkgroup
data-cbtrack-label
*/
},"storeLength":"pageview"},
"Feature Used": {"customJS":function(){
/**
* Created by jbeach on 2017-01-22
* Updated by jbeach on 2018-04-02
*/
kiwi = window.kiwi || {};
var ruleName='KIWI: Data Element > Feature Used';
var val = '',
valSrc = '';
if (kiwi.featureUsed) {
//use Kiwi
val = kiwi.featureUsed;
valSrc = 'Kiwi';
} else if (_satellite.getVar('AppData Feature Used')) {
//use AppData
val = _satellite.getVar('Site Code') + ':' +_satellite.getVar('AppData Feature Used');
valSrc = 'AppData';
} else if (_satellite.getVar('DDL Feature Used')) {
//use DDL
val = _satellite.getVar('DDL Feature Used');
valSrc = 'DDL';
} else if (_satellite.getVar('SCode Feature Used')) {
//use SCode
val = _satellite.getVar('SCode Feature Used');
valSrc = 'SCode';
}
if (val) _satellite.notify(ruleName+': ('+valSrc+') '+ val);
return val;
},"storeLength":"pageview","forceLowerCase":true,"cleanText":true},
"Feature Views - Accordions": {"customJS":function(){
/**
* Created by jbeach on 2019-01-23
* Updated by jbeach on 2019-10-15
* Notes: supports mulitple accordions per DOM page
*/
kiwi = window.kiwi || {};
kiwi.util = kiwi.util || {};
kiwi.util.getFeatureText = kiwi.util.getFeatureText || function() {_satellite.notify('Missing function: kiwi.util.getFeatureText()');};
//var ruleName='KIWI: Data Element > Feature Views - Accordions';
var featId = 'accordion',
val = {
hasData: false,
featureType: featId,
featureNames: []
},
elements = document.querySelectorAll('.cb-accordion'),
alreadyViewed = false;
if (elements) {
for (var i = 0; i<elements.length; i++) {
var element = elements[i],
elementSection = element.closest('[class*="wrapper"]') || element.closest('.container'),
elementText = '';
if (element.offsetParent) {//visible!
if ((element.hasAttribute('data-cbtrack-' + featId))) alreadyViewed = true;
if (!alreadyViewed) {
val.hasData = true;
if (elementSection) elementText = kiwi.util.getFeatureText(elementSection.querySelector('h2, h3, h4, h5, h6'));
else elementText = kiwi.util.getFeatureText(element.closest('h2, h3, h4, h5, h6') || document.querySelector('h1'));
val.featureNames.push(elementText);
element.setAttribute('data-cbtrack-' + featId, elementText);
}
}
}
}
//_satellite.notify(ruleName+': '+ JSON.stringify(val));
return val;
/* Developing for:
https://wiki.collegeboardnewmedia.org/display/wa/Features+Tracking
https://uihub.wcm.collegeboard.org/ui/3.4.0/accordion/
//https://collegereadiness.collegeboard.org/sat/k12-educators/sat-school-day/timeline
//https://uihub.wcm.collegeboard.org/ui/3.3.0/accordion/
*/
},"storeLength":"pageview"},
"Feature Views - Crosslinks": {"customJS":function(){
/**
* Created by jbeach on 2019-04-12
* Updated by jbeach on 2019-05-06
* Notes: supports mulitple crosslinks per DOM page
*/
kiwi = window.kiwi || {};
kiwi.util = kiwi.util || {};
kiwi.util.getFeatureText = kiwi.util.getFeatureText || function() {_satellite.notify('Missing function: kiwi.util.getFeatureText()');};
//var ruleName='KIWI: Data Element > Feature Views - Crosslinks';
var val = {
hasData: false,
featureType: 'crosslink',
featureNames: []
},
elements = document.querySelectorAll('[data-cbtrack-linktype*="crosslink"]'),
alreadyViewed = false;
if (elements) {
for (var i = 0; i<elements.length; i++) {
var element = elements[i],
crosslink = '';
if ((element.hasAttribute('data-cbtrack-crosslink'))) alreadyViewed = true;
if (!alreadyViewed) {
val.hasData = true;
crosslink = kiwi.util.getFeatureText(element);
val.featureNames.push(crosslink);
element.setAttribute('data-cbtrack-crosslink', crosslink);
}
}
}
//_satellite.notify(ruleName+': '+ JSON.stringify(val));
return val;
/* Developing for:
event242 - Feature Views (set once per feature+visit), tracked with:
pageName - Page (e.g. Feature Host Page)
prop43 - (Feature Name) Feature Used ("crosslink:[ name of crosslink ]")
*/
//crosslink element = document.querySelectorAll('[data-cbtrack-linktype*="crosslink"]');
//feature name = kiwi.util.scrapeDomName(crosslink element, '(,|=)').toLowerCase();
//DRUPAL 8 crosslink attribute:
//https://apstudent-dev.collegeboard.org/node/56
/*
<div class="col-md-offset-2 col-md-8 col-xs-12">
<h2 id="dialogTitle">Not a Student?</h2>
<p id="dialogDesc"><a data-cbtrack-linktype="crosslink" href="http://apcentral.collegeboard.org">Go to AP Central</a> for resources for teachers, administrators, and coordinators.</p>
</div>
*/
},"storeLength":"pageview"},
"Feature Views - CTA Cards": {"customJS":function(){
/**
* Created by jbeach on 2019-05-02
* Updated by jbeach on 2019-05-19
* Notes: supports multiple ctacards per DOM page
*/
kiwi = window.kiwi || {};
kiwi.util = kiwi.util || {};
kiwi.util.getFeatureText = kiwi.util.getFeatureText || function() {_satellite.notify('Missing function: kiwi.util.getFeatureText()');};
//var ruleName='KIWI: Data Element > Feature Views - CTA Cards';
var featId = 'ctacard',
val = {
hasData: false,
featureType: featId,
featureNames: []
},
elements = document.querySelectorAll('.cb-cta-card'),
alreadyViewed = false;
if (elements) {
for (var i = 0; i<elements.length; i++) {
var element = elements[i],
//elementSection = element.closest('.container'),
elementType = 'verta',
featureText = '',
elementText = '',
elPromos = element.querySelectorAll('a,button');
if ((element.hasAttribute('data-cbtrack-' + featId))) alreadyViewed = true;
if (!alreadyViewed) {
if (element.classList.contains('cb-horizontal-card')) elementType = 'horiz';
if (element.classList.contains('cb-vertical-card')) elementType = 'vertb';
val.hasData = true;
featureText = elementType;
val.featureNames.push(featureText);
element.setAttribute('data-cbtrack-' + featId, featureText);
//wire up promos
for (var j = 0; j<elPromos.length; j++) {
var elPromo = elPromos[j];
if(!(elPromo.hasAttribute('data-cbtrack-linktype') && elPromo.getAttribute('data-cbtrack-linktype').match(/(^|,)nav(,|$)/i))) {
elementText = kiwi.util.getFeatureText(element);
elPromo.setAttribute('data-cbtrack-promo', '');
elPromo.setAttribute('data-cbtrack-label', elementText);
}
}
}
}
}
//_satellite.notify(ruleName+': '+ JSON.stringify(val));
return val;
/* Developing for:
https://wiki.collegeboardnewmedia.org/display/wa/Features+Tracking
//https://uihub.wcm.collegeboard.org/ui/3.4.0/ctacards/index.html
*/
},"storeLength":"pageview"},
"Feature Views - Custom": {"customJS":function(){
/* global jQuery */
/**
* Created by jbeach on 2019-03-25
* Updated by jbeach on 2019-05-16
*/
//kiwi = window.kiwi || {};
//kiwi.util = kiwi.util || {};
//var ruleName='KIWI: Data Element > Feature Views - Custom';
var val = {
hasData: false,
featureType: 'custom',
featureNames: []
},
element,
fwEligibilityModal = document.querySelector('#fwEligibilityModal'),
alreadyViewed = false;
if (fwEligibilityModal) {
if ((fwEligibilityModal.hasAttribute('data-cbtrack-custom'))) alreadyViewed = true;
if (!alreadyViewed) {
val.hasData = true;
element = 'fw-eligibility-modal';
val.featureNames.push(element);
fwEligibilityModal.setAttribute('data-cbtrack-custom', element);
if (typeof jQuery != 'undefined') {//jQuery library exists
jQuery( document ).ready(function( $ ) {//alias $ in-case another '$' exists on page
$('#fwEligibilityModal').on('hide.bs.modal', function () {
_satellite.notify('fwEligibilityModal Hide!');
fwEligibilityModal.dispatchEvent(new CustomEvent('kiwi.modalHide', {'bubbles': true}));
});
});
}
}
}
//_satellite.notify(ruleName+': '+ JSON.stringify(val));
return val;
/* Developing for:
event242 - Feature Views (set once per feature+visit), tracked with:
pageName - Page (e.g. Filter Host Page)
prop43 - (Feature Type + Feature Name) Feature Used ("custom:[ name of feature ]")
event243 - Feature Interactions (set once per feature option+visit), tracked with:
pev2 - Custom Link ("Feature Used - Custom")
prop25 - Page Sending Custom Link (e.g. Feature Host Page)
prop43 - (Feature Name) Feature Used ("custom:[ name of feature ]")
prop29 - Feature Options Used - List Variable Enabled, separator = ",", clean text of commas, equal signs before storing
prop30 - Feature Used Count (+1 each time feature option+visit occurs)
*/
/* Click-A-Student Fee Waiver Benefits Modal Acceptance Tracking Plan:
- on Dismiss of #fwEligibilityModal or Submit of #fwEligibility
- Track Fee Waiver Benefit Accept Option [name="FwEligibilityOptIn"]
- either YES: #fwEligibilityOptYes/[value="Accepted"]
- or NO: #fwEligibilityOptNo/[value="NotAccepted"]
- or DEFER: #fwEligibilityOptAskagain/[value="AskAgain"] OR
Modal Dismiss without Form Submit
*/
},"storeLength":"pageview"},
"Feature Views - Event Cards": {"customJS":function(){
/**
* Created by jbeach on 2019-05-17
* Updated by jbeach on 2019-10-03
* Notes: supports multiple eventcards groups per DOM page
*/
kiwi = window.kiwi || {};
kiwi.util = kiwi.util || {};
kiwi.util.getFeatureText = kiwi.util.getFeatureText || function() {_satellite.notify('Missing function: kiwi.util.getFeatureText()');};
//var ruleName='KIWI: Data Element > Feature Views - Event Cards';
var featId = 'ec',
val = {
hasData: false,
featureType: featId,
featureNames: []
},
elements = document.querySelectorAll('.cb-event-cards'),
alreadyViewed = false;
if (elements) {
for (var i = 0; i<elements.length; i++) {
var element = elements[i],
elementSection = element.closest('.container'),
elementType = 'tl-horiz',
elementText = '',
elPromos = element.querySelectorAll('.cb-event-key a, .cb-event-key button');
if ((element.hasAttribute('data-cbtrack-' + featId))) alreadyViewed = true;
if (!alreadyViewed) {
if (element.classList.contains('cb-event-cards-vertical')) elementType = 'tl-vert';
if (element.classList.contains('cb-event-non-timeline')) elementType = 'no-tl';
val.hasData = true;
if (elementSection) elementText = kiwi.util.getFeatureText(elementSection.querySelector('h2, h3, h4, h5, h6'));
else elementText = kiwi.util.getFeatureText(element.closest('h2, h3, h4, h5, h6') || document.querySelector('h1'));
elementText = elementType + ':' + elementText;
val.featureNames.push(elementText);
element.setAttribute('data-cbtrack-' + featId, elementText);
//wire up promos
for (var j = 0; j<elPromos.length; j++) {
var elPromo = elPromos[j];
elementText = kiwi.util.getFeatureText(element);
elPromo.setAttribute('data-cbtrack-promo', '');
elPromo.setAttribute('data-cbtrack-label', elementText);
}
}
}
}
//_satellite.notify(ruleName+': '+ JSON.stringify(val));
return val;
/* Developing for:
https://wiki.collegeboardnewmedia.org/display/wa/Features+Tracking
https://uihub.wcm.collegeboard.org/ui/3.4.0/eventCards/
*/
},"storeLength":"pageview"},
"Feature Views - Features": {"customJS":function(){
//var ruleName='KIWI: Data Element > Feature Views - Features';
var featId = 'feature',
val = {
hasData: false,
featureType: featId,
featureNames: []
},
elements = document.querySelectorAll('[data-cbtrack-'+featId+']'),
alreadyViewed = false;
if (elements.length) {
for (var i = 0; i < elements.length; i++) {
var element = elements[i],
featureText = element.getAttribute('data-cbtrack-'+featId+''),
arrFeatureText = featureText.split('|'),
featureType = featId,
kiwiAttributeNameFeat = 'data-kiwi-feature',
kiwiAttributeNameClick = 'data-kiwi-featureclick',
kiwiAttributeNameType = 'data-kiwi-',
elementChildren = element.querySelectorAll('a, button, [data-cbtrack-click], [data-cbtrack-promo]');
if (arrFeatureText.length > 1) {
featureType = arrFeatureText[0];
featureText = arrFeatureText.slice(1).join('|')
}
kiwiAttributeNameType += featureType;
alreadyViewed = (element.hasAttribute(kiwiAttributeNameFeat));
if (!alreadyViewed) {
val.hasData = true;
val.featureType = featureType;
val.featureNames.push(featureText);
element.setAttribute(kiwiAttributeNameFeat, featureType);
element.setAttribute(kiwiAttributeNameType, featureText);
if (!elementChildren.length) {
element.setAttribute(kiwiAttributeNameClick, 'self');
}
for (var j = 0; j < elementChildren.length; j++) {
var elChild = elementChildren[j],
childText = kiwi.util.getFeatureText(elChild).substring(0,39) || 'some-link-'+j;
elChild.setAttribute(kiwiAttributeNameClick, childText);
}
}
}
}
return val;
},"storeLength":"pageview"},
"Feature Views - Filters": {"customJS":function(){
/**
* Created by jbeach on 2019-01-15
* Updated by jbeach on 2019-05-06
*/
kiwi = window.kiwi || {};
kiwi.util = kiwi.util || {};
kiwi.util.getFeatureText = kiwi.util.getFeatureText || function() {_satellite.notify('Missing function: kiwi.util.getFeatureText()');};
//var ruleName='KIWI: Data Element > Feature Views - Filters';
var val = {
hasData: false,
featureType: 'filter',
featureNames: []
},
containers = document.querySelectorAll('.cb-filter-container, .view-filters, #block-cb-test-center-search-test-center-code-search-form, #clep_test_center_search'),
alreadyViewed = false;
if (containers) {
for (var i = 0; i<containers.length; i++) {
var container = containers[i],
filter = '';
if ((container.hasAttribute('data-cbtrack-filter'))) alreadyViewed = true;
if (!alreadyViewed) {
val.hasData = true;
filter = kiwi.util.getFeatureText(container.closest('h2, h3, h4, h5, h6') || document.querySelector('h1'), [['|','-'],[':','-'],['=','-'],[',','-']]);
val.featureNames.push(filter);
container.setAttribute('data-cbtrack-filter', filter);
}
}
}
//_satellite.notify(ruleName+': '+ JSON.stringify(val));
return val;
/* Developing for:
event240 - Filter Views (set once per filter+visit), tracked with:
pageName - Page (e.g. Filter Host Page)
prop43 - (Filter Name) Feature Used ("filter:[ name of filter ]")
event241 - Filter Applies (set once per filter submit), tracked with:
pev2 - Custom Link ("Filter Applied")
prop25 - Page Sending Custom Link (e.g. Filter Host Page)
prop43 - (Filter Name) Feature Used ("filter:[ name of filter ]")
prop29 - Filter Options Used ("[ label text ]=[ option text ],...n") - List Variable Enabled, separator = ",", clean text of commas, equal signs before storing
prop30 - Feature Used Count (+1 each time filter submit+visit occurs)
*/
//filter container = document.querySelector('.cb-filter-container, .view-filters');
//nearest filter heading = container.closest('h2, h3, h4, h5, h6') || document.querySelector('h1');
//filter name = kiwi.util.scrapeDomName(heading, '(,|=)').toLowerCase();
//apricot 3.3.0 FILTER CONTAINER = .cb-filter-container
//apricot 3.3.0 FILTER SELECT = .cb-filter-container .cb-filter-options select
//apricot 3.3.0 FILTER OPTION NAME = .cb-filter-container .cb-filter-options >> .find('label[for="' + $select.attr('id') + '"]');
//apricot 3.3.0 FILTER OPTION VALUE = .cb-filter-container .cb-filter-options select >> .find('option:selected').text()
//apricot 3.3.0 FILTER BUTTON = .cb-filter-container .cb-filter-apply
//apricot 3.3.0 FILTER REMOVE = .cb-filter-container .cb-filter-remove
//apricot 3.3.0 RESULTS DISPLAY = ??
//drupal module FILTER CONTAINER = .view-filters
//drupal module FILTER SELECT = .view-filters form select
//drupal module FILTER OPTION NAME = .view-filters form >> .find('label[for="' + $select.attr('id') + '"]');
//drupal module FILTER OPTION VALUE = .view-filters form select >> .find('option:selected').text()
//drupal module FILTER BUTTON = .view-filters form [type="submit"]
//drupal module RESULTS DISPLAY = .view-filters .cb-resource
//counselors/resources; aru/resources = .view-filters form [type="submit"]
//lv look up widget = div.lv-lookup-widget .lv-search-box button[name="lv-see-results"]
//els = document.querySelectorAll('div.view[class*="resources"] form button[type="submit"]');
//div.lv-lookup-widget .lv-list
//div.view[class*="resources"] .cb-resource
//https://collegereadiness.collegeboard.org/sat/register/find-test-centers
//https://clep.collegeboard.org/test-center-search
},"storeLength":"pageview"},
"Feature Views - Jump Links": {"customJS":function(){
/**
* Created by jbeach on 2019-02-05
* Updated by jbeach on 2019-10-03
*/
kiwi = window.kiwi || {};
kiwi.util = kiwi.util || {};
kiwi.util.getFeatureText = kiwi.util.getFeatureText || function() {_satellite.notify('Missing function: kiwi.util.getFeatureText()');};
//var ruleName='KIWI: Data Element > Feature Views - Jump Links';
var featId = 'jumplinks',
val = {
hasData: false,
featureType: featId,
featureNames: []
},
elements = document.querySelectorAll('.cb-jumplinks-menu, #help-topics + ul'),
alreadyViewed = false;
if (elements) {
for (var i = 0; i<elements.length; i++) {
var element = elements[i],
elementSection = element.closest('[class*="wrapper"]') || element.closest('.container'),
elementText = '';
if ((element.hasAttribute('data-cbtrack-' + featId))) alreadyViewed = true;
if (!alreadyViewed) {
val.hasData = true;
if (elementSection) elementText = kiwi.util.getFeatureText(elementSection.querySelector('h2, h3, h4, h5, h6'));
else elementText = kiwi.util.getFeatureText(element.closest('h2, h3, h4, h5, h6') || document.querySelector('h1'));
val.featureNames.push(elementText);
element.setAttribute('data-cbtrack-' + featId, elementText);
}
}
}
//_satellite.notify(ruleName+': '+ JSON.stringify(val));
return val;
/* Developing for:
https://wiki.collegeboardnewmedia.org/display/wa/Features+Tracking
https://uihub.wcm.collegeboard.org/ui/3.4.0/jumpLinks/
//https://opportunity-staging.collegeplanning-nonprod.collegeboard.org/faq
//https://collegereadiness.collegeboard.org/educators/k-12/reporting-portal-help
//https://pages.collegeboard.org/account-help
//https://professionals.collegeboard.org/guidance/counseling/counselor-resources
*/
},"storeLength":"pageview"},
"Feature Views - Key Benefits": {"customJS":function(){
/**
* Created by jbeach on 2019-11-19
* Updated by jbeach on 2019-11-19
* only tracks the first set of Key Benefits on a page
*/
kiwi = window.kiwi || {};
kiwi.util = kiwi.util || {};
kiwi.util.getFeatureText = kiwi.util.getFeatureText || function() {_satellite.notify('Missing function: kiwi.util.getFeatureText()');};
//var ruleName='KIWI: Data Element > Feature Views - Key Benefits';
var featId = 'keybenefits',
val = {
hasData: false,
featureType: featId,
featureNames: []
},
childElement = document.querySelector('.cb-key-benefit'),
alreadyViewed = false;
if (childElement) {
//for (var i = 0; i<elements.length; i++) {
var element = childElement.closest('.container-flex');
if (element) {
var elementText = '';
if (element.offsetParent) {//visible!
if ((element.hasAttribute('data-cbtrack-' + featId))) alreadyViewed = true;
if (!alreadyViewed) {
val.hasData = true;
elementText = kiwi.util.getFeatureText(document.querySelector('#block-cb-hero-welcome-mat h1') || document.querySelector('h1'));
val.featureNames.push(elementText);
element.setAttribute('data-cbtrack-' + featId, elementText);
}
}
}
//}
}
//_satellite.notify(ruleName+': '+ JSON.stringify(val));
return val;
/* Developing for:
https://jira.collegeboard.org/browse/WAP-3506
https://about.collegeboard.org/privacy-center/privacy-statement
.container-flex (with child .cb-key-benefit) = Tracked Feature (walk up to page H1 for text)
.cb-key-benefit .cb-block-title = Feature Option Prefix Text
.cb-key-benefit a = Feature Option clickable element and postpended text
*/
//key-benefits container = document.querySelector('.cb-key-benefit').getClosest('.container-flex');
//nearest heading = container.closest('h2, h3, h4, h5, h6') || document.querySelector('h1');
//feature name = kiwi.util.scrapeDomName(heading, '(,|=)').toLowerCase();
},"storeLength":"pageview"},
"Feature Views - Layout Panels": {"customJS":function(){
/**
* Created by jbeach on 2019-05-17
* Updated by jbeach on 2019-05-18
* Notes: supports multiple panels per DOM page
* will only track layout panels that include a clickable CTA button
*/
kiwi = window.kiwi || {};
kiwi.util = kiwi.util || {};
kiwi.util.getFeatureText = kiwi.util.getFeatureText || function() {_satellite.notify('Missing function: kiwi.util.getFeatureText()');};
//var ruleName='KIWI: Data Element > Feature Views - Layout Panels';
var featId = 'layp',
val = {
hasData: false,
featureType: featId,
featureNames: []
},
elementChildren = document.querySelectorAll('.cb-layout-panel .cb-panel-cta'),
elements = [],
alreadyViewed = false;
if (elementChildren) {
for (var k = 0; k<elementChildren.length; k++) {
elements.push(elementChildren[k].closest('.cb-layout-panel'));
}
}
if (elements.length) {
for (var i = 0; i<elements.length; i++) {
var element = elements[i],
featureText = '',
elementText = kiwi.util.getFeatureText(element.querySelector('h2, h3, h4, h5, h6') || element.closest('h2, h3, h4, h5, h6') || document.querySelector('h1')),
elPromos = element.querySelectorAll('.cb-panel-cta a, .cb-panel-cta button');
if ((element.hasAttribute('data-cbtrack-'+ featId))) alreadyViewed = true;
if (!alreadyViewed) {
val.hasData = true;
featureText = elementText;
val.featureNames.push(featureText);
element.setAttribute('data-cbtrack-' + featId, featureText);
//wire up promos
for (var j = 0; j<elPromos.length; j++) {
var elPromo = elPromos[j];
elPromo.setAttribute('data-cbtrack-promo', '');
elPromo.setAttribute('data-cbtrack-label', '');
}
}
}
}
//_satellite.notify(ruleName+': '+ JSON.stringify(val));
return val;
/* Developing for:
https://wiki.collegeboardnewmedia.org/display/wa/Features+Tracking
https://uihub.wcm.collegeboard.org/ui/3.4.0/layoutpanels/
*/
},"storeLength":"pageview"},
"Feature Views - Widgets": {"customJS":function(){
/**
* Created by jbeach on 2019-03-13
* Updated by jbeach on 2019-10-04
*/
kiwi = window.kiwi || {};
kiwi.ddl = kiwi.ddl || {};
kiwi.ddl.atlas = kiwi.ddl.atlas || {};
kiwi.util = kiwi.util || {};
kiwi.util.appendToList = kiwi.util.appendToList || function() {_satellite.notify('Missing function: kiwi.util.appendToList()');};
kiwi.pageTrack = kiwi.pageTrack || {};
kiwi.pageTrack.startTime = kiwi.pageTrack.startTime || 0;
kiwi.pageTrack.widgetReachTime = kiwi.pageTrack.widgetReachTime || 0;
kiwi.widgetTrack = kiwi.widgetTrack || {};
kiwi.widgetTrack.pageStartTime = kiwi.widgetTrack.pageStartTime || 0;
kiwi.widgetTrack.widgetReachTime = kiwi.widgetTrack.widgetReachTime || 0;
var widgetStartTime=kiwi.pageTrack.startTime || kiwi.widgetTrack.pageStartTime || 0,
widgetReachTime=kiwi.pageTrack.widgetReachTime || kiwi.widgetTrack.widgetReachTime || 0;
var ruleName='KIWI: Data Element > Feature Views - Widgets';
/* kiwi.ddl.atlas SCHEMA:
/*_widgetName: {
isNew: true,
components: {
_componentName: {
isNew: true,
status: '',
componentError: '',
serviceStartIndex: 0,
totalNewServices: 0,
services: {
_serviceName: {
state: '',
duration: '',
errorMessage: ''
}
}
}
}
}*/
var val = {
hasData: false,
widgets: '',
widgetLoads: '',
widgetFails: '',
widgetServices: '',
loadSpeed: 0,
errorType: '',
errorCode: '',
featureType: 'widget',
featureNames: []
},
loopObj = kiwi.ddl.atlas,
hasWidget = false;
//_satellite.notify('KIWI: Atlas Widgets Data found: ' + JSON.stringify(oData));
//report on only unreported elements in the object
Object.keys(loopObj).forEach(function (widget) {
var oWidget = this[widget],
reportThisWidget = false,
hasFail = false;
if (oWidget.isNew) {
hasWidget = reportThisWidget = true;
val.widgets = kiwi.util.appendToList(val.widgets, widget, ',', 2);
}
if (oWidget.components && typeof oWidget.components === 'object') {
Object.keys(oWidget.components).forEach(function (component) {
var oComponent = this[component],
hasComponent = false;
if (oComponent.isNew) {
hasWidget = reportThisWidget = true;
hasComponent = true;
if (oComponent.status !== 'ready') {
hasFail = true;
//define load fail as error
if (val.errorType === '') {
val.errorType = 'widget-fail (' + widget + ')';
val.errorCode = val.errorType + ': ' + oComponent.status;
if (oComponent.componentError) val.errorCode += ': ' + oComponent.componentError;
}
val.widgets = kiwi.util.appendToList(val.widgets, widget, ',', 2);
}
}
if (oComponent.services && typeof oComponent.services === 'object') {
Object.keys(oComponent.services).forEach(function (service) {
var oService = this[service],
hasService = false;
if (oService.isNew) {
hasWidget = reportThisWidget = true;
hasComponent = true;
hasService = true;
if (oService.state !== 'success') {
hasFail = true;
//define service fail as error; and it takes precedence
if (val.errorType === '' || val.errorType === 'widget-fail') {
val.errorType = 'widget-service-fail (' + service + ')';
val.errorCode = val.errorType + ': ' + oService.state;
if (oService.errorMessage) val.errorCode += ': ' + oService.errorMessage;
}
} else {
if (service === 'axios-student-photo') {//TODO: fix global tracker widget so this hack is unnecessary
_satellite.notify(ruleName + ' > axios-student-photo service widgetStartTime: '+ widgetStartTime);
_satellite.notify(ruleName + ' > axios-student-photo service widgetReachTime: '+ widgetReachTime);
val.loadSpeed = widgetReachTime ? Math.round((widgetReachTime-widgetStartTime)) : Math.round(oService.duration);
} else {
//find largest overall request load speed and only report that one
if (oService.duration > val.loadSpeed) val.loadSpeed = Math.round(oService.duration);
}
}
val.widgets = kiwi.util.appendToList(val.widgets, widget, ',', 2);
val.widgetServices = kiwi.util.appendToList(val.widgetServices, service, ',', 2);
}
kiwi.ddl.atlas[widget].components[component].services[service].isNew = hasService;
}, oComponent.services);
}
kiwi.ddl.atlas[widget].components[component].isNew = hasComponent;
}, oWidget.components);
if (reportThisWidget) {
if (hasFail) {
val.widgetFails = kiwi.util.appendToList(val.widgetFails, widget, ',', 2);
} else {
val.widgetLoads = kiwi.util.appendToList(val.widgetLoads, widget, ',', 2);
}
}
reportThisWidget = false;
hasFail = false;
}
kiwi.ddl.atlas[widget].isNew = hasWidget;
}, loopObj);
if (hasWidget) val.hasData = true;
val.featureNames = val.widgets.split(',');
//_satellite.notify(ruleName + 'val: ' + JSON.stringify(val));
return val;
/* set on analytics:
_satellite.notify('KIWI: Atlas Widgets Data processed: ' + JSON.stringify(oData));
var linkTrackVars = 'events,prop26',
linkTrackEvents = 'event194';
linkTrackVars += oData.widgetLoads?',prop27':'';
linkTrackVars += oData.widgetFails?',prop28':'';
linkTrackVars += oData.state==='error'?',prop11,prop12,prop13':'';
linkTrackEvents += oData.widgetServices?',event195':'';
s.linkTrackVars=s.apl(s.linkTrackVars, linkTrackVars, ',', 2);
s.linkTrackEvents=s.apl(s.linkTrackEvents, linkTrackEvents, ',', 2);
s.events = s.apl(s.events, linkTrackEvents, ',', 2); //Atlas Widget Ready Calls, Atlas Widget with Service Ready Calls
s.prop26 = oData.widgets; //Atlas Widgets Attempted
s.prop27 = oData.widgetLoads; //Atlas Widgets Loaded
s.prop28 = oData.widgetFails; //Atlas Widgets Failed
s.xxx = oData.widgetServices; //Atlas Widget Services Requested
s.eVar91 = oData.loadSpeed; //Service Backed Element Load Speed
if (oData.state === 'error') {
s.prop11 = oData.errorType; //Error Type
s.prop12 = oData.errorCode; //Error Code
s.prop13 = 'D=pageName'; //Page with Error
}
*/
},"storeLength":"pageview"},
"Global Nav ID": {"queryParam":"navid","storeLength":"pageview","forceLowerCase":true,"cleanText":true,"ignoreCase":1},
"IAM Cookie - WAP_EXTERNAL_PROPERTIES": {"cookie":"WAP_EXTERNAL_PROPERTIES","storeLength":"pageview"},
"Is Download Link": {"customJS":function(){
kiwi = window.kiwi || {};
var ruleName='Data Element > Is Download Link';
var val = '',
e = kiwi._elementToTest;
if (e && e.getAttribute('href')) {
if (e.href.match(/\.(?:arf|avi|css|csv|dmg|doc|docx|dotx|eps|exe|ics|js|m4v|mov|mp3|mp4|mpg|pages|pdf|ppt|pptx|rar|rm|rtf|swf|tab|txt|vsd|vxd|wav|wma|wmv|xls|xlsx|xml|zip)($|\&|\?)/i)) val = 'true';
else if (e.getAttribute('data-cbtrack-download')) val = 'true';
else if (e.getAttribute('download')) val = 'true';
else if (e.getAttribute('dynamic-asset-link-track')) val = 'true';
}
_satellite.notify(ruleName+': '+ val);
return val;
},"storeLength":"pageview"},
"Kiwi Config - Custom Events": {"customJS":function(){
/* global YAHOO, fbq, gtag, snaptr */
/**
* Created by jbeach on 2017-07-06
* Updated by jbeach on 2020-02-06
*
* key to groups of tracking commands to fire during certain custom events
*/
kiwi = window.kiwi || {};
kiwi.cookie = kiwi.cookie || {};
kiwi.cookie.sess = kiwi.cookie.sess || {};
kiwi.cookie.sess.mboxEvents = kiwi.cookie.sess.mboxEvents || {};
var adobe = window.adobe || {};
adobe.target = adobe.target || {};
adobe.target.trackEvent = adobe.target.trackEvent || function() {_satellite.notify('Missing function: adobe.target.trackEvent'); return false;};
//var _aimtellTrackAttributes = window._aimtellTrackAttributes || function() {_satellite.notify('Missing function: _aimtellTrackAttributes'); return false;};
var ruleName='KIWI: Data Element > Kiwi Config - Custom Events';
var val = {
'Page View': function ( ) {
//fire custom event scripts
/**
* Provided by developers.aimtell.com on 2019-07-09
* https://developers.aimtell.com/v1.1/reference#api-track-subscriber-event
* https://jira.collegeboard.org/browse/WAP-2827
* Configured by jbeach on 2019-07-09 - INCOMPLETE
if (kiwi._thisPage.siteCode === 'myap' && _satellite.getVar('DDL - User Role')) {
var cbWebAccountId = _satellite.getVar('CB Web - Account ID'),
role = _satellite.getVar('DDL - User Role'),
aimtellSubscriberId = 'TBD',
data = JSON.stringify({
"idSite":"6137",
"subscriber_uid": aimtellSubscriberId,
"attributes": {
"cbWebAccountId":cbWebAccountId,
"myAp-appUserRole":role
}
});
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;
xhr.addEventListener("readystatechange", function () {
if (this.readyState === this.DONE) {
console.log(this.responseText);
}
});
xhr.open("POST", "https://api.aimtell.com/prod/subscriber/");
xhr.setRequestHeader("x-authorization", "NLM3fme5B5e15VpVwiLpy4kKtzoBdi413Q4idioP");
xhr.send(data);
}
**/
},
'SAT Reg': function( params ) {
//fire custom event scripts
_satellite.notify(ruleName + '> SAT Reg - Custom Events: Google AdWords');
//convert params to custom event format
var isSubjTest = params.isSubjTest,
isRepeat = params.isRepeat,
usedFeeWaiver = params.usedFeeWaiver,
adminDate = params.satRegAdminDate,
purchaseId = params.purchaseId,
adminType = '',
adminType2 = params.adminType,
registrantType = 'first-sat-any',
feeWaiverUsage = 'no-fee-waiver';
if (isSubjTest) {
//Subject Test SAT
adminType = 'subj';
if (window.gtag) {
gtag('event', 'conversion', {
'send_to': 'AW-1066570316/mU_WCO7Nx4gBEMykyvwD',
'value': 26.0,
'currency': 'USD',
'transaction_id': ''
});
}
if (window.fbq) {
fbq('trackSingle', '519836601522904', 'PageView');
_satellite.notify(ruleName + '> Page View - Custom Events: Facebook (CB Main):PageView');
fbq('trackSingle', '519836601522904', 'Purchase', {value: '26.00', currency: 'USD'});
_satellite.notify(ruleName + '> SAT Reg - Custom Events: Facebook (CB Main):Purchase');
fbq('trackSingle', '641101116419565', 'PageView');
_satellite.notify(ruleName + '> Page View - Custom Events: Facebook (CB India):PageView');
fbq('trackSingle', '641101116419565', 'Purchase', {value: '26.00', currency: 'USD'});
_satellite.notify(ruleName + '> SAT Reg - Custom Events: Facebook (CB India):Purchase');
}
/**
* Provided by SnapChat in 2019-02-22
* https://jira.collegeboard.org/browse/WAP-2241
* Configured by jbeach on 2019-02-25
**/
if (window.snaptr) {
_satellite.notify(ruleName + '> SAT Reg - Complete - Custom Events: SnapChat:PURCHASE (Subject Test)');
snaptr('track', 'PURCHASE', {'currency':'USD','price':26.00,'transaction_id':purchaseId});
}
} else {
//Core SAT
adminType = 'core';
if (window.gtag) {
gtag('event', 'conversion', {
'send_to': 'AW-1066570316/i1cgCKGq94QBEMykyvwD',
'value': 45.0,
'currency': 'USD',
'transaction_id': ''
});
/**
* Set Google Ad Conversion for SAT Core Registrations
* Provided by Alex Simonides on 2019-02-06
* https://jira.collegeboard.org/browse/WAP-2767
* Configured by jbeach on 2020-02-06
* Updated by jbeach on 2020-02-06
**/
gtag('event', 'conversion', {
'send_to': 'AW-725129111/aNOpCPiYs8ABEJev4tkC',
'value': 45.0,
'currency': 'USD',
'transaction_id': ''
});
}
if (window.fbq) {
fbq('trackSingle', '519836601522904', 'PageView');
_satellite.notify(ruleName + '> Page View - Custom Events: Facebook (CB Main):PageView');
fbq('trackSingle', '519836601522904', 'Purchase', {value: '45.00', currency: 'USD'});
_satellite.notify(ruleName + '> SAT Reg - Custom Events: Facebook (CB Main):Purchase');
fbq('trackSingle', '641101116419565', 'PageView');
_satellite.notify(ruleName + '> Page View - Custom Events: Facebook (CB India):PageView');
fbq('trackSingle', '641101116419565', 'Purchase', {value: '45.00', currency: 'USD'});
_satellite.notify(ruleName + '> SAT Reg - Custom Events: Facebook (CB India):Purchase');
}
/**
* Provided by SnapChat in 2019-02-22
* https://jira.collegeboard.org/browse/WAP-2241
* Configured by jbeach on 2019-02-25
**/
if (window.snaptr) {
_satellite.notify(ruleName + '> SAT Reg - Complete - Custom Events: SnapChat:PURCHASE (Core Test)');
snaptr('track', 'PURCHASE', {'currency':'USD','price':45.00,'transaction_id':purchaseId});
}
}
if (usedFeeWaiver) {
//Fee Waiver conversion
if (window.gtag) {
gtag('event', 'conversion', {
'send_to': 'AW-1066570316/__gbCL2w1ogBEMykyvwD',
'transaction_id': ''
});
}
feeWaiverUsage = 'used-fee-waiver';
}
if (isRepeat) {
//Repeat conversion
if (window.gtag) {
gtag('event', 'conversion', {
'send_to': 'AW-1066570316/dJwiCLLKx4gBEMykyvwD',
'transaction_id': ''
});
}
registrantType = 'repeat-sat-any';
}
//set mbox profile parameters on SAT Reg (WAP-2194)
adobe.target.trackEvent({
'mbox': 'track_sat_reg',
'params': {
'profile.SatRegAdminDate': adminDate, //example: 201903
'profile.SatRegAdminType': adminType, //options: core, subj
'profile.SatRegistrantType': registrantType, //options: first-sat-any, repeat-sat-any
'profile.SatFeeWaiverUsage': feeWaiverUsage //options: no-fee-waiver, used-fee-waiver
}
});
/**
* Set Push Notification Parameters on SAT Reg
* Provided by Kristie DeSousa in 2019-02
* https://jira.collegeboard.org/browse/WAP-2195
* Configured by jbeach on 2019-04-03
**/
_satellite.notify(ruleName + '> SAT Reg - Complete - Custom Events: Aimtell Track Event');
(function(){
var ids = '6136',
ec = 'SAT',
ea = 'SAT Registration',
el = adminType2+':'+adminDate+':'+registrantType+':'+feeWaiverUsage,
atpixel = document.createElement('iframe');
atpixel.setAttribute('src', 'https://beacon.aimtell.com/p?i='+ids+'&ec='+ec+'&ea='+ea+'&el='+el);
atpixel.style.width = '1px'; atpixel.style.height = '1px'; atpixel.style.display = 'none';
document.body.appendChild(atpixel);
})();
_satellite.notify(ruleName + '> SAT Reg - Custom Pixel Events: Division D');
if (typeof YAHOO === 'undefined') {//only load on the page once
/**
* Provided by Priya Shah in 2019-02
* https://jira.collegeboard.org/browse/WAP-2256
* Configured by jbeach on 2019-02-13
* I need to place this pixel on the following pages:
* SAT Registration after a student registers
* CBOS "Agree" button on the T&Cs page when a user opts into the program
* https://bigfuture.collegeboard.org/scholarship-search
* https://bigfuture.collegeboard.org/pay-for-college/grants-scholarships
* https://bigfuture.collegeboard.org/college-search
* https://studentscores.collegeboard.org/viewscore
**/
(function (w,d,t,r,u) {
w[u] = w[u] || [];
w[u].push({ 'projectId': '10000', 'properties': { 'pixelId': '10063589' } });
var s = d.createElement(t);
s.src = r;
s.async = true;
s.onload = s.onreadystatechange = function () {
var y, rs = this.readyState, c = w[u];
if (rs && rs != 'complete' && rs != 'loaded') { return; }
try {
y = YAHOO.ywa.I13N.fireBeacon;
w[u] = [];
w[u].push = function (p) { y([p]); };
y(c);
} catch (e) { return; }
};
var scr = d.getElementsByTagName(t)[0], par = scr.parentNode; par.insertBefore(s, scr);
})(window, document, 'script', 'https://s.yimg.com/wi/ytc.js', 'dotq');
}
/**
* Provided by Gino Kuo in 2019-02
* https://jira.collegeboard.org/browse/WAP-2246
* Configured by jbeach on 2019-02-14
**/
_satellite.notify(ruleName + '> SAT Reg - Reached - Order Complete - Custom Events: India Remarket');
(function(){
var colombiaPixelURL = 'https://ade.clmbtech.com/cde/eventTracking.htm?pixelId=4558&_w=1&rd='+new Date().getTime();
(new Image()).src = colombiaPixelURL;
})();
/**
* Provided by Priya Shah (via AdMedia) in 2019-08
* Updated by AdMedia on 2019-09-05
* https://jira.collegeboard.org/browse/WAP-3074
* We are testing out a new partner for a back to school SAT campaign (not ACT conquesting).
* Can you please place the conversion pixel on the Registration thank you page and the retargeting pixels on the below pages?
* conversion
* Page: SAT Registration Conversions
* <img src="//pixel.admedia.com/p.php?ai=15055&ct=SubmitApplication&cv=">
* Configured by jbeach on 2019-09-05
**/
_satellite.notify(ruleName + '> SAT Reg - Reached - Order Complete - Custom Events: AdMedia');
(function(){
var px=document.createElement('img');
px.width = '1';
px.height = '1';
px.style = 'border-style:none;';
px.alt = '';
px.src = '//pixel.admedia.com/p.php?ai=15055&ct=SubmitApplication&cv=';
document.getElementsByTagName('body')[0].appendChild(px);
})();
return;
},
'SAT Reg Step': function( params ) {
_satellite.notify(ruleName + '> SAT Reg Step - params: '+ JSON.stringify(params));
//convert params to custom event format
var stepEvent = params.stepEvent;
//fire custom event scripts
if (stepEvent) {
_satellite.notify(ruleName + '> SAT Reg Step - stepEvent: '+ stepEvent);
switch (stepEvent) {
case 'event150'://SAT Reg - Step - Get Started
if (window.fbq) {
fbq('trackSingle', '519836601522904', 'PageView');
_satellite.notify(ruleName + '> Page View - Custom Events: Facebook (CB Main):PageView');
fbq('trackSingle', '519836601522904', 'ViewContent', {content_name: 'SATReg-Start'});
_satellite.notify(ruleName + '> SAT Reg Reached - stepEvent: '+ stepEvent + ' Facebook (CB Main):ViewContent:SATReg-Start');
}
/**
* Provided by Gino Kuo in 2019-02
* https://jira.collegeboard.org/browse/WAP-2246
* Configured by jbeach on 2019-02-14
**/
_satellite.notify(ruleName + '> SAT Reg Step - Start - Custom Events: India Remarket');
(function(){
var colombiaPixelURL = 'https://ade.clmbtech.com/cde/eventTracking.htm?pixelId=4570&_w=1&rd='+new Date().getTime();
(new Image()).src = colombiaPixelURL;
})();
/**
* Provided by SnapChat in 2019-02-22
* https://jira.collegeboard.org/browse/WAP-2241
* Configured by jbeach on 2019-02-25
**/
if (window.snaptr) {
_satellite.notify(ruleName + '> SAT Reg - Step - Get Started - Custom Events: SnapChat:VIEW_CONTENT');
snaptr('track', 'VIEW_CONTENT');
}
break;
case 'event151'://SATReg-Profile PI
/**
* Provided by Gino Kuo in 2019-02
* https://jira.collegeboard.org/browse/WAP-2246
* Configured by jbeach on 2019-02-14
**/
_satellite.notify(ruleName + '> SAT Reg Step - Profile PI - Custom Events: India Remarket');
(function(){
var colombiaPixelURL = 'https://ade.clmbtech.com/cde/eventTracking.htm?pixelId=4572&_w=1&rd='+new Date().getTime();
(new Image()).src = colombiaPixelURL;
})();
break;
case 'event154'://SATReg-SDQ
if (window.fbq) {
fbq('trackSingle', '519836601522904', 'PageView');
_satellite.notify(ruleName + '> Page View - Custom Events: Facebook (CB Main):PageView');
fbq('trackSingle', '519836601522904', 'ViewContent', {content_name: 'SATReg-SDQ'});
_satellite.notify(ruleName + '> SAT Reg Reached - stepEvent: '+ stepEvent + ' Facebook (CB Main):ViewContent:SATReg-SDQ');
}
break;
case 'event164'://SATReg-Terms
if (window.fbq) {
fbq('trackSingle', '519836601522904', 'PageView');
_satellite.notify(ruleName + '> Page View - Custom Events: Facebook (CB Main):PageView');
fbq('trackSingle', '519836601522904', 'ViewContent', {content_name: 'SATReg-Terms'});
_satellite.notify(ruleName + '> SAT Reg Reached - stepEvent: '+ stepEvent + ' Facebook (CB Main):ViewContent:SATReg-Terms');
}
break;
case 'event165'://SATReg-ChooseTest&Date
/**
* Provided by Gino Kuo in 2019-02
* https://jira.collegeboard.org/browse/WAP-2246
* Configured by jbeach on 2019-02-14
**/
_satellite.notify(ruleName + '> SAT Reg Step - Choose Test Center - Custom Events: India Remarket');
(function(){
var colombiaPixelURL = 'https://ade.clmbtech.com/cde/eventTracking.htm?pixelId=4573&_w=1&rd='+new Date().getTime();
(new Image()).src = colombiaPixelURL;
})();
break;
case 'event71'://SAT Reg - Reached - Choose Test Center
if (window.fbq) {
fbq('trackSingle', '519836601522904', 'PageView');
_satellite.notify(ruleName + '> Page View - Custom Events: Facebook (CB Main):PageView');
fbq('trackSingle', '519836601522904', 'AddToCart', {value: '45.00', currency: 'USD'});
_satellite.notify(ruleName + '> SAT Reg Reached - stepEvent: '+ stepEvent + ' Facebook (CB Main):AddToCart');
fbq('trackSingle', '641101116419565', 'PageView');
_satellite.notify(ruleName + '> Page View - Custom Events: Facebook (CB India):PageView');
fbq('trackSingle', '641101116419565', 'AddToCart', {value: '45.00', currency: 'USD'});
_satellite.notify(ruleName + '> SAT Reg Reached - stepEvent: '+ stepEvent + ' Facebook (CB India):AddToCart');
}
/**
* Provided by Gino Kuo in 2019-02
* https://jira.collegeboard.org/browse/WAP-2246
* Configured by jbeach on 2019-02-14
**/
_satellite.notify(ruleName + '> SAT Reg - Reached - Choose Test Center - Custom Events: India Remarket');
(function(){
var colombiaPixelURL = 'https://ade.clmbtech.com/cde/eventTracking.htm?pixelId=4574&_w=1&rd='+new Date().getTime();
(new Image()).src = colombiaPixelURL;
})();
/**
* Provided by SnapChat in 2019-02-22
* https://jira.collegeboard.org/browse/WAP-2241
* Configured by jbeach on 2019-02-25
**/
if (window.snaptr) {
_satellite.notify(ruleName + '> SAT Reg - Reached - Choose Test Center - Custom Events: SnapChat:ADD_CART');
snaptr('track', 'ADD_CART');
}
break;
case 'event72'://SATReg-PhotoUpload
/**
* Provided by Gino Kuo in 2019-02
* https://jira.collegeboard.org/browse/WAP-2246
* Configured by jbeach on 2019-02-14
**/
_satellite.notify(ruleName + '> SAT Reg - Reached - Photo Upload - Custom Events: India Remarket');
(function(){
var colombiaPixelURL = 'https://ade.clmbtech.com/cde/eventTracking.htm?pixelId=4569&_w=1&rd='+new Date().getTime();
(new Image()).src = colombiaPixelURL;
})();
break;
case 'event73'://SATReg-Crosssell
/**
* Provided by Gino Kuo in 2019-02
* https://jira.collegeboard.org/browse/WAP-2246
* Configured by jbeach on 2019-02-14
**/
_satellite.notify(ruleName + '> SAT Reg - Reached - Cross Sell - Custom Events: India Remarket');
(function(){
var colombiaPixelURL = 'https://ade.clmbtech.com/cde/eventTracking.htm?pixelId=4559&_w=1&rd='+new Date().getTime();
(new Image()).src = colombiaPixelURL;
})();
break;
case 'event74'://SAT Reg - Reached - Review Order
if (window.fbq) {
fbq('trackSingle', '519836601522904', 'PageView');
_satellite.notify(ruleName + '> Page View - Custom Events: Facebook (CB Main):PageView');
fbq('trackSingle', '519836601522904', 'InitiateCheckout', {value: '45.00', currency: 'USD'});
_satellite.notify(ruleName + '> SAT Reg Reached - stepEvent: '+ stepEvent + ' Facebook (CB Main):InitiateCheckout');
}
/**
* Provided by Gino Kuo in 2019-02
* https://jira.collegeboard.org/browse/WAP-2246
* Configured by jbeach on 2019-02-14
**/
_satellite.notify(ruleName + '> SAT Reg - Reached - Review Order - Custom Events: India Remarket');
(function(){
var colombiaPixelURL = 'https://ade.clmbtech.com/cde/eventTracking.htm?pixelId=4571&_w=1&rd='+new Date().getTime();
(new Image()).src = colombiaPixelURL;
})();
/**
* Provided by SnapChat in 2019-02-22
* https://jira.collegeboard.org/browse/WAP-2241
* Configured by jbeach on 2019-02-25
**/
if (window.snaptr) {
_satellite.notify(ruleName + '> SAT Reg - Reached - Review Order - Custom Events: SnapChat:START_CHECKOUT');
snaptr('track', 'START_CHECKOUT');
}
break;
case 'event171'://SAT Reg - Step - Reg Accept Popup
if (window.fbq) {
fbq('trackSingle', '519836601522904', 'PageView');
_satellite.notify(ruleName + '> Page View - Custom Events: Facebook (CB Main):PageView');
fbq('trackSingle', '519836601522904', 'AddPaymentInfo', {value: '45.00', currency: 'USD'});
_satellite.notify(ruleName + '> SAT Reg Reached - stepEvent: '+ stepEvent + ' Facebook (CB Main):AddPaymentInfo');
}
/**
* Provided by SnapChat in 2019-02-22
* https://jira.collegeboard.org/browse/WAP-2241
* Configured by jbeach on 2019-02-25
**/
if (window.snaptr) {
_satellite.notify(ruleName + '> SAT Reg - Step - Reg Accept Popup - Custom Events: SnapChat:ADD_BILLING');
snaptr('track', 'ADD_BILLING');
}
break;
default:
_satellite.notify(ruleName + '> SAT Reg Step - stepEvent Not Configured');
break;
}
} else {_satellite.notify(ruleName + '> SAT Reg Step - Missing stepEvent');}
},
'Confirm ECL Account Create': function( ) {//on click of next button before ECL account create
//fire custom event scripts
/**
* -- Facebook Pixel Code --
* Provided by CB India Team (via Gino Kuo) in 2019-10
* "trackSingle" syntax taken from https://washamdev.com/multiple-facebook-pixels-on-one-site/
* https://jira.collegeboard.org/browse/WAP-3289
* Originally Configured by jbeach on 2019-10-11
* Last Updated by jbeach on 2019-10-11
*/
if (window.fbq) {
fbq('trackSingle', '641101116419565', 'PageView');
_satellite.notify(ruleName + '> ECL Account Created - Custom Events: Facebook (CB India):PageView');
fbq('trackSingle', '641101116419565', 'Lead');
_satellite.notify(ruleName + '> ECL Account Created - Custom Events: Facebook (CB India):Lead');
}
/**
* -- Global site tag (gtag.js) - Google Analytics --
* Provided by Kunal Mehra on CB India Team (via their Advertising Partner) in 10/2019
* https://jira.collegeboard.org/browse/WAP-3373
* Originally Configured by jbeach on 2018-10-23
* Last Updated by jbeach on 2019-10-23
*/
if (window.gtag) {
gtag('event', 'conversion', {
'send_to': 'AW-716553948/ENF0CMPA-K4BENz91tUC'
});
_satellite.notify(ruleName + '> ECL Account Created - Custom Events: Google (CB India):AW Conversion');
}
/**
* -- Global site tag (gtag.js) - Google Analytics --
* Provided by Kunal Mehra/Ira Rajeev on CB India Team (via their Advertising Partner) in 1/2020
* https://jira.collegeboard.org/browse/WAP-3866
* Originally Configured by jbeach on 2018-10-23
* Updated by jbeach on 2020-01-31
*/
if (window.gtag) {
gtag('event', 'conversion', {
'send_to': 'AW-673395677/PdXoCOCrksABEN3njMEC'
});
_satellite.notify(ruleName + '> ECL Account Created - Custom Events: Google (CB India 2):AW Conversion');
}
/**
* Provided by Kunal Mehra on CB India Team (via their Advertising Partner) in 10/2019
* https://jira.collegeboard.org/browse/WAP-3373
* Originally Configured by jbeach on 2018-10-23
* Last Updated by jbeach on 2019-10-23
**/
if (window.snaptr) {
snaptr('track', 'SIGN_UP');
_satellite.notify(ruleName + '> ECL Account Created - Custom Events: SnapChat (CB India):SIGN_UP');
}
return;
},
'ECL Account Created': function( ) {
//fire custom event scripts
//because the ECL thank you page auto-redirects after 10 seconds, this might not capture tracking in time
//so we can move it to the earlier page "ECL Account Confirm"
return;
},
'College List Saved': function( ) {
//fire custom event scripts
/**
* Set Push Notification Parameters on College List Created
* Provided by Kristie DeSousa in 2019-02
* https://jira.collegeboard.org/browse/WAP-2195
* Configured by jbeach on 2019-04-03
**/
_satellite.notify(ruleName + '> College List Saved - Custom Events: Aimtell Track Event');
(function(){
var ids = '6136',
ec = 'CBOS',
ea = 'College List Created',
atpixel = document.createElement('iframe');
atpixel.setAttribute('src', 'https://beacon.aimtell.com/p?i='+ids+'&ec='+ec+'&ea='+ea);
atpixel.style.width = '1px'; atpixel.style.height = '1px'; atpixel.style.display = 'none';
document.body.appendChild(atpixel);
})();
/**
* Updates to FB Pixel
* Requested by Kristel Picinic in 2019-11
* https://jira.collegeboard.org/browse/WAP-3500
* Configured by jbeach on 2019-11-06
**/
if (window.fbq) {
fbq('trackSingle', '519836601522904', 'Search');
_satellite.notify(ruleName + '> College List Saved - Custom Events: Facebook (CB Main):Search');
}
return;
},
'Khan Account Linked': function( ) {
//fire custom event scripts
/**
* Set Push Notification Parameters on College List Created
* Provided by Kristie DeSousa in 2019-02
* https://jira.collegeboard.org/browse/WAP-2195
* Configured by jbeach on 2019-04-04
**/
_satellite.notify(ruleName + '> Khan Account Linked - Custom Events: Aimtell Track Event');
(function(){
var ids = '6136', //6136,6137,6244,6245,6246,6247,6357,6357,6409,6411,6413,6417,6419,6421,7774,8414,8474,10256,10450,11221
ec = 'CBOS',
ea = 'Khan Account Linked',
atpixel = document.createElement('iframe');
atpixel.setAttribute('src', 'https://beacon.aimtell.com/p?i='+ids+'&ec='+ec+'&ea='+ea);
atpixel.style.width = '1px'; atpixel.style.height = '1px'; atpixel.style.display = 'none';
document.body.appendChild(atpixel);
})();
return;
},
'SAT Score Viewed': function( params ) {
//fire custom event scripts
var adminType = params.adminType || 'not-avail', //options: satst, satwe, satne
adminDate = params.adminDate || 'not-avail', //examples: 201903, 201624
registrantType = params.registrantType || 'not-avail', //options: first-sat-any, repeat-sat-any
fwStatus = params.fwStatus || 'not-avail', //options: no-fee-waiver, used-fee-waiver
scoreBand = params.scoreBand || 'not-avail'; //options: <1050, 1050-1400, >1400
/**
* Set Push Notification Parameters on SAT Score View
* Provided by Kristie DeSousa in 2019-02
* https://jira.collegeboard.org/browse/WAP-2195
* Configured by jbeach on 2019-04-03
* Examples:
* satst:201603:not-avail:not-avail:<1050
* satwe:201603:not-avail:not-avail:<1050
* satne:201624:not-avail:not-avail:1050-1400
* satwe:201624:not-avail:not-avail:>1400
**/
_satellite.notify(ruleName + '> SAT Score Viewed - Custom Events: Aimtell Track Event');
params = params || {};
var ids = '6136',
ec = 'SAT',
ea = 'SAT Score View',
el = adminType+':'+adminDate+':'+registrantType+':'+fwStatus+':'+scoreBand,
atpixel = document.createElement('iframe');
atpixel.setAttribute('src', 'https://beacon.aimtell.com/p?i='+ids+'&ec='+ec+'&ea='+ea+'&el='+el);
atpixel.style.width = '1px'; atpixel.style.height = '1px'; atpixel.style.display = 'none';
document.body.appendChild(atpixel);
/**
* Set MBOX Profile Parameters on SAT Score View
* Provided by Kristie DeSousa in 2018
* https://jira.collegeboard.org/browse/WAP-2339
* https://jira.collegeboard.org/browse/WAP-2588 - multiple calls bug fix
* Configured by jbeach on 2019-05-13
* Examples:
* satst - 201603 - not-avail - not-avail - <1050
* satwe - 201603 - not-avail - not-avail - <1050
* satne - 201624 - not-avail - not-avail - 1050-1400
* satwe - 201624 - not-avail - not-avail - >1400
**/
if (!kiwi.cookie.sess.mboxEvents.track_sat_sv) {
adobe.target.trackEvent({
'mbox': 'track_sat_sv',
'params': {
'profile.SatScoreAdminDate': adminDate,
'profile.SatScoreAdminType': adminType,
'profile.SatScoreRegistrantType': registrantType,
'profile.SatScoreFeeWaiverStatus': fwStatus,
'profile.SatScoreBand': scoreBand
}
});
//signal sess cookie updates
kiwi._sessCookieMod = true;
kiwi.cookie.sess.mboxEvents.track_sat_sv = true;
}
return;
},
'PSAT Score Viewed': function( params ) {
//fire custom event scripts
var adminType = params.adminType || 'not-avail', //options: psatnm, psat10, psat89
adminDate = params.adminDate || 'not-avail', //examples: 2016, 2015
registrantType = params.registrantType || 'not-avail', //options: first-psat-any, repeat-psat-any
fwStatus = params.fwStatus || 'not-avail', //options: no-fee-waiver, used-fee-waiver
scoreBand = params.scoreBand || 'not-avail'; //options: <1050, 1050-1400, >1400
/**
* Set Push Notification Parameters on PSAT Score View
* Provided by Kristie DeSousa in 2019-02
* https://jira.collegeboard.org/browse/WAP-2195
* Configured by jbeach on 2019-04-03
**/
_satellite.notify(ruleName + '> PSAT Score Viewed - Custom Events: Aimtell Track Event');
params = params || {};
var ids = '6136',
ec = 'PSAT',
ea = 'PSAT Score View',
el = adminType+':'+adminDate+':'+registrantType+':'+fwStatus+':'+scoreBand,
atpixel = document.createElement('iframe');
atpixel.setAttribute('src', 'https://beacon.aimtell.com/p?i='+ids+'&ec='+ec+'&ea='+ea+'&el='+el);
atpixel.style.width = '1px'; atpixel.style.height = '1px'; atpixel.style.display = 'none';
document.body.appendChild(atpixel);
/**
* Set MBOX Profile Parameters on PSAT Score View
* Provided by Kristie DeSousa in 2018
* https://jira.collegeboard.org/browse/WAP-2339
* https://jira.collegeboard.org/browse/WAP-2588 - multiple calls bug fix
* Configured by jbeach on 2019-05-13
* Configured by jbeach on 2019-04-10
* Examples:
* psatnm - 2016 - not-avail - not-avail - 1050-1400
* psatnm - 2015 - not-avail - not-avail - <1050
* psat10 - 2016 - not-avail - not-avail - 1050-1400
* psat89 - 2014 - not-avail - not-avail - >1400
**/
if (!kiwi.cookie.sess.mboxEvents.track_psat_sv) {
adobe.target.trackEvent({
'mbox': 'track_psat_sv',
'params': {
'profile.PsatScoreAdminDate': adminDate,
'profile.PsatScoreAdminType': adminType,
'profile.PsatScoreRegistrantType': registrantType,
'profile.PsatScoreFeeWaiverStatus': fwStatus,
'profile.PsatScoreBand': scoreBand
}
});
//signal sess cookie updates
kiwi._sessCookieMod = true;
kiwi.cookie.sess.mboxEvents.track_psat_sv = true;
}
return;
},
'PN2018 Score Viewed': function( ) {
//fire custom event scripts
return;
},
'CBOS Terms Accept': function( ) {
//fire custom event scripts
/**
* Provided by SnapChat in 2019-02-22
* https://jira.collegeboard.org/browse/WAP-2241
* Configured by jbeach on 2019-02-25
**/
if (window.snaptr) {
_satellite.notify(ruleName + '> CBOS Terms Accept - Custom Events: SnapChat:SIGN_UP');
snaptr('track', 'SIGN_UP');
}
/**
* Provided by Priya Shah in 2019-02
* https://jira.collegeboard.org/browse/WAP-2256
* Configured by jbeach on 2019-02-13
* I need to place this pixel on the following pages:
* SAT Registration after a student registers
* CBOS "Agree" button on the T&Cs page when a user opts into the program
* https://bigfuture.collegeboard.org/scholarship-search
* https://bigfuture.collegeboard.org/pay-for-college/grants-scholarships
* https://bigfuture.collegeboard.org/college-search
* https://studentscores.collegeboard.org/viewscore
**/
/**
* Provided by Priya Shah in 2019-08-22
* https://jira.collegeboard.org/browse/WAP-3034
* Configured by jbeach on 2019-08-27
* Can you please place this pixel on the accept button on the T&Cs page to count as an opt in
* conversion for CBOS?
**/
kiwi = window.kiwi || {};
kiwi.pixels = kiwi.pixels || {};
kiwi.pixels.divisiond = kiwi.pixels.divisiond || {};
kiwi.pixels.divisiond.yahoo = kiwi.pixels.divisiond.yahoo || {};
kiwi.pixels.divisiond.yahoo.projectId = '10000';
kiwi.pixels.divisiond.yahoo.pixelId = '10063589';
var projectId = kiwi.pixels.divisiond.yahoo.projectId,
pixelId = kiwi.pixels.divisiond.yahoo.pixelId;
if (projectId && pixelId && typeof YAHOO === 'undefined') {
_satellite.notify(ruleName + '> CBOS Terms Accept - Custom Events: Division D Retargeting for CBOS');
(function(w,d,t,r,u){w[u]=w[u]||[];w[u].push({'projectId':projectId,'properties':{'pixelId':pixelId}});var s=d.createElement(t);s.src=r;s.async=true;s.onload=s.onreadystatechange=function(){var y,rs=this.readyState,c=w[u];if(rs&&rs!='complete'&&rs!='loaded')
{return}try{y=YAHOO.ywa.I13N.fireBeacon;w[u]=[];w[u].push=function(p){y([p])};y(c)}catch(e){}};var scr=d.getElementsByTagName(t)[0],par=scr.parentNode;par.insertBefore(s,scr)})(window,document,'script','https://s.yimg.com/wi/ytc.js','dotq');
window.dotq = window.dotq || [];
window.dotq.push({
'projectId': projectId,
'properties': {
'pixelId': pixelId,
'qstrings': {
'et': 'custom',
'ec':'accepttscs'
}
}
});
}
/**
* Set Push Notification Parameters on CBOS Optin
* Provided by Kristie DeSousa in 2019-02
* https://jira.collegeboard.org/browse/WAP-2195
* Configured by jbeach on 2019-04-03
**/
_satellite.notify(ruleName + '> CBOS Terms Accept - Custom Events: Aimtell Track Event');
(function(){
var ids = '6136',
ec = 'CBOS',
ea = 'CBOS Optin',
el = 'yes',
atpixel = document.createElement('iframe');
atpixel.setAttribute('src', 'https://beacon.aimtell.com/p?i='+ids+'&ec='+ec+'&ea='+ea+'&el='+el);
atpixel.style.width = '1px'; atpixel.style.height = '1px'; atpixel.style.display = 'none';
document.body.appendChild(atpixel);
})();
/**
* Updates to FB Pixel
* Requested by Kristel Picinic in 2019-11
* https://jira.collegeboard.org/browse/WAP-3500
* Configured by jbeach on 2019-11-06
**/
if (window.fbq) {
fbq('trackSingle', '519836601522904', 'Contact');
_satellite.notify(ruleName + '> CBOS Terms Accept - Custom Events: Facebook (CB Main):Contact');
}
/**
* AdMedia Pixel on CBOS
* Requested by Priya Shah in 2019-11
* https://jira.collegeboard.org/browse/WAP-3552
* Can you please Implement this Admedia Pixel to track when a user opts into CBOS?
* <script type="text/javascript" src="//pixel.admedia.com/w.php?ai=15055&ct=Subscribe&cv="></script>
* Configured by jbeach on 2019-11-12
**/
_satellite.notify(ruleName + '> CBOS Terms Accept - Custom Events: AdMedia Pixel');
(function(){
var pixel = document.createElement('script');
pixel.setAttribute('src', '//pixel.admedia.com/w.php?ai=15055&ct=Subscribe&cv=');
document.body.appendChild(pixel);
})();
},
'CBOS Opt Out': function( ) {
//fire custom event scripts
/**
* Set Push Notification Parameters on CBOS Opt Out
* Provided by Kristie DeSousa in 2019-02
* https://jira.collegeboard.org/browse/WAP-2195
* Configured by jbeach on 2019-04-03
**/
_satellite.notify(ruleName + '> CBOS Opt Out - Custom Events: Aimtell Track Event');
(function(){
var ids = '6136',
ec = 'CBOS',
ea = 'CBOS Optin',
el = 'no',
atpixel = document.createElement('iframe');
atpixel.setAttribute('src', 'https://beacon.aimtell.com/p?i='+ids+'&ec='+ec+'&ea='+ea+'&el='+el);
atpixel.style.width = '1px'; atpixel.style.height = '1px'; atpixel.style.display = 'none';
document.body.appendChild(atpixel);
})();
},
'CLEP Registration': function( ) {
//fire custom event scripts
/**
* Updates to FB Pixel
* Requested by Kristel Picinic in 2019-11
* https://jira.collegeboard.org/browse/WAP-3500
* Configured by jbeach on 2019-11-06
**/
if (window.fbq) {
fbq('trackSingle', '519836601522904', 'CompleteRegistration');
_satellite.notify(ruleName + '> CLEP Registration - Custom Events: Facebook (CB Main):CompleteRegistration');
}
return;
}
};
//_satellite.notify(ruleName+': '+ JSON.stringify(val));
return val;
},"storeLength":"pageview"},
"Kiwi Config - Navs": {"customJS":function(){
/**
* Created by jbeach on 2017-11-14
* Updated by jbeach on 2019-03-22
*
* maps rendered global/local nav link hierarchical css selectors to tracked nav type codes
* KEY values must NOT have "|" character present
* when subNavs are nested, list the innermost first
*/
//var ruleName='KIWI: Data Element > Kiwi Config - Navs';
var val = {
/* Global Header */
'gh': {
navType: 'global',
selectors: ['.lv-globalHeader-widget'],
trackViewEvent: 'event220',
trackClickEvent: 'event221',
subNavs: {
parentSelectors: {
'menu-bar': '.lv-gh-bar',
'nav-menu': '[aria-label="Global Navigation"]',
'login-panel': '[aria-label="Login Panel"] [namespace="identity-5.2.0-view20"]',
'student-nav': '[aria-label="Login Panel"] [namespace="identity-5.2.0-view21"]',
'prof-nav': '[aria-label="Login Panel"] [namespace="identity-5.2.0-view23"]',
'search-panel': '[aria-label="Search Panel"]',
'search-form': '[aria-label="Search Form"]'
},
itemSelectors: {}
}
},
/* Global Footer */
'gf': {
navType: 'global',
selectors: ['.lv-globalfooter-widget'],
trackViewEvent: 'event222',
trackClickEvent: 'event223',
subNavs: {}
},
/* Local Navigation - Top */
'ltop': {
navType: 'local',
trackViewEvent: 'event224',
trackClickEvent: 'event225',
selectors: ['nav.top-navigation', '.cb-local-navigation'],
subNavs: {
parentSelectors: {
'dropdown': '.dropdown .leaf',
'menu-bar': 'nav.cb-desktop-navigation',
'mobile-nav': 'nav.cb-mobile-navigation'
},
itemSelectors: {}
}
},
/* Local Navigation - Left */
'left': {
navType: 'local',
trackViewEvent: 'event226',
trackClickEvent: 'event227',
selectors: [
'.cb-left-navigation' //Apricot 3.0.0 and earlier
],
subNavs: {}
},
/* Program Band */
'program-band': {
navType: 'local',
trackViewEvent: 'event228',
trackClickEvent: 'event229',
selectors: [
'.cb-program-band', //Apricot 3.0.0
'#cb-program-band' //Legacy, a.k.a. "boxes"
],
subNavs: {}
},
/* Login Hero (Pre Auth) */
'hero-preauth': {
navType: 'local',
trackViewEvent: 'event230',
trackClickEvent: 'event231',
selectors: [
'#cb-hero-login .lv-logged-out', //WWW (legacy)
'.lv-login-hero-widget' //APFYM
],
subNavs: {}
},
/* Login Hero (Post Auth) */
'hero-postauth': {
navType: 'local',
trackViewEvent: 'event232',
trackClickEvent: 'event233',
selectors: [
'#cb-hero-login .lv-logged-in', //WWW (legacy)
'.lv-login-hero-widget' //APFYM
],
subNavs: {}
},
/* Breadcrumbs */
'breadcrumb': {
navType: 'local',
trackViewEvent: 'event234',
trackClickEvent: 'event235',
selectors: [
'nav .breadcrumb' //Apricot 3.0.0 and earlier
],
subNavs: {}
},
/* Architectural Views (a.k.a. Navigational Cards) */
'body': {
navType: 'local',
trackViewEvent: 'event236',
trackClickEvent: 'event237',
selectors: [
'.cb-arch-view', //Apricot 3.0.0 and earlier
'.portal1-architectural' //Apricot (legacy)
],
subNavs: {}
},
/* Tabs */
'tab': {
navType: 'local',
trackViewEvent: 'event238',
trackClickEvent: 'event239',
selectors: [
'.nav-tabs' //Apricot 3.0.0
],
subNavs: {}
}
/* Menu Bar
'bar': {
trackViewEvent: 'eventXXX',
parentSelectors: [
'.cb-menu-bar .cb-desktop-menu-bar', //Apricot 3.0.0
'.cb-menu-bar .cb-mobile-menu-bar' //Apricot 3.0.0
]
}, */
/* Anchor Menu
'anchor': {
trackViewEvent: 'eventXXX',
parentSelectors: [
'.cb-anchor-menu' //Apricot 3.0.0
]
} */
/* Series Toggle
'series': {
trackViewEvent: 'eventXXX',
parentSelectors: [
'.cb-series-toggle' //Apricot 3.0.0
]
}, */
};
//_satellite.notify(ruleName+': '+ JSON.stringify(val));
return val;
/* Global/Apricot Navigation Elements
* Global Header
* Global Footer
* Navigation - Top
* Navigation - Top
* Navigation - Left
* Menu Bar
* Hero
* Breadcrumbs
* Architectural Views (a.k.a. Navigational Cards)
* Anchor Menu
* Program Band
* Series Toggle
* Tabs
*/
},"storeLength":"pageview"},
"Kiwi Config - Page Name Params": {"customJS":function(){
var ruleName='KIWI: Data Element > Kiwi Config - Page Name Params';
var val = ''
+ 'pagenameflow'
+ 'department,'
+ 'PageName,'
+ 'state,'
+ 'aclev,action,activity,applicationId,buttonPressed,category,'
+ 'codeSearchAction,decorator,dispatch,erjob,examType,FAQID,filter,Form,forumId,fromPage,isOnline,location,'
+ 'match,method,nav,navigateTo,New,oq,page,pageIndex,pg,pid,preTest,relativePath,reportId,secondCategory,'
+ 'sectionCd,sku,src,Step,subjectId,t,tab,testYear,thirdLevelCategory,tid,track,trackSubmitPage,type,'
+ 'viewDesc';
//remove "category" from BF pages
if (document.location.hostname.match(/^bigfuture\.collegeboard\.org/i)) {
val = val.replace(/,category,/, ',');
_satellite.notify(ruleName+': customizing for bf: '+ val);
}
return val;
},"storeLength":"pageview"},
"Kiwi Config - Page Track Suppress": {"customJS":function(){
/**
* Created by jbeach on 2017-12-04
* Updated by jbeach on 2017-12-12
*/
var ruleName='KIWI: Data Element > Kiwi Config - Page Track Suppress';
var val = [
/*{
siteCode: 'uihubstg.wcm',
suppressAllPages: true,
suppressPages: [
'widgets/demos/examples/app1',
'widgets/demos/examples/app2'
]
},
{
siteCode: 'www',
suppressAllPages: false,
suppressPages: [
'home'
]
},
{
siteCode: 'www-stg',
suppressAllPages: false,
suppressPages: [
'splash'
]
}*/
];
//_satellite.notify(ruleName+': '+ val);
return val;
},"storeLength":"pageview"},
"Kiwi Config - Pixels - New Relic": {"customJS":function(){
var ruleName='KIWI: Data Element > Kiwi Config - Pixels - New Relic';
_satellite.notify(ruleName);
return {
license_key: {
prod: '7b743d630b',
perf: 'cd2ed5e216',
uat: 'cd2ed5e216',
qa: 'cd2ed5e216',
dev: 'cd2ed5e216'
},
default_sampling_rate: { // 1 out of x new sessions will get pixel
prod: 100, //includes both pre-prod and real prod
perf: 1,
uat: 1, //includes both staging, oat
qa: 1,
dev: 1
},
subdomains: {
/*'example.collegeboard.org': {
default_env: 'prod',
default_id: '99',
default_sampling_rate: 1, // 1 out of x new sessions will get pixel
prod: {
id: '100',
sampling_rate: 100 // 1 out of x new sessions will get pixel
},
perf: {
id: '101',
sampling_rate: 1
},
uat: {
id: '102',
sampling_rate: 1
},
qa: {
id: '103',
sampling_rate: 1
},
dev: {
id: '104',
sampling_rate: 1
},
},*/
'account.collegeboard.org': { //paaccount
default_id: '80510097'
},
'apscore.collegeboard.org': { //paapsscores
default_id: '80510477'
},
'apscoreadmin.collegeboard.org': { //paapsadmin
default_id: '80510544'
},
'apstudent.collegeboard.org': { //paapwr
default_id: '80507567'
},
'bigfuture.collegeboard.org': { //bigfuture
default_id: '319073656'
},
'cbsearch.collegeboard.org': { //pastudentsrch
default_id: '81287584'
},
'cbsearchadmin.collegeboard.org': { //passsadmin
default_id: '81287756'
},
'clepadmin.collegeboard.org': { //cpa
default_id: '81287749'
},
'clepportal.collegeboard.org': { //paclepcand
default_id: '80465411'
},
'contactus.collegeboard.org': { //pacontactus
default_id: '80507301'
},
'csdashboard.collegeboard.org': { //pacsdash
default_id: '80504110'
},
'cyclemanagement.collegeboard.org': { //pacycmgmtadm
default_id: '80507388'
},
'hedreports.collegeboard.org': { //pahedrpt
default_id: '80506038'
},
/*'k12reports.collegeboard.org': { //pak12rpt
default_id: '80502474'
},*/
'k12reports.collegeboard.org': { //pacloudportal (prod)
default_id: '111217099'
},
'k12studentscores.collegeboard.org': {
default_env: 'prod',
default_id: '457133636',
prod: {
id: '457133636' //K12-SSRVIEW, WAP-4012
},
perf: {
id: '457133362' //K12-SSRVIEW-PERF, WAP-4012
},
uat: {
id: '457133172' //K12-SSRVIEW-UAT, WAP-4012
},
qa: {
id: '457132804' //K12-SSRVIEW-QA, WAP-4012
},
dev: {
id: '457132261' //K12-SSRVIEW-DEV, WAP-4012
}
},
'k12cloudportal-prod.reportingportal-prod.collegeboard.org': { //K12-SSRVIEW, WAP-4012
default_env: 'prod',
default_id: '457133636',
default_sampling_rate: 1
},
'k12cloudportal-perf.reportingportal-nonprod.collegeboard.org': { //K12-SSRVIEW-PERF, WAP-4012
default_env: 'perf',
default_id: '457133362'
},
'k12cloudportal-uat.reportingportal-nonprod.collegeboard.org': { //K12-SSRVIEW-UAT, WAP-4012
default_env: 'uat',
default_id: '457133172'
},
'k12cloudportal-qa.reportingportal-nonprod.collegeboard.org': { //K12-SSRVIEW-QA, WAP-4012
default_env: 'qa',
default_id: '457132804'
},
'k12cloudportal-dev.reportingportal-nonprod.collegeboard.org': { //K12-SSRVIEW-DEV, WAP-4012
default_env: 'dev',
default_id: '457132261'
},
'my.collegeboard.org': { //cborg prod
default_env: 'prod',
default_id: '562086435',
default_sampling_rate: 1,
prod: {
id: '562086435'
},
perf: {
id: '562095941'
},
uat: { //includes both staging, oat
id: '562095941'
},
qa: {
id: '562095941'
},
dev: {
id: '562095941'
}
},
'mycb-prod.mycollegeboard-prod.collegeboard.org': { //pine proxy + prod
default_env: 'prod',
default_id: '562086435',
default_sampling_rate: 1
},
'mycb-perf.mycollegeboard-nonprod.collegeboard.org': { //spruce proxy + performance
default_env: 'perf',
default_id: '562095941'
},
'mycb-oat.mycollegeboard-nonprod.collegeboard.org': { //oat proxy + oat/uat
default_env: 'uat',
default_id: '562095941'
},
'mycb-staging.mycollegeboard-nonprod.collegeboard.org': { //apple proxy + staging
default_env: 'uat',
default_id: '562095941'
},
'mycb-qa.mycollegeboard-nonprod.collegeboard.org': { //palm proxy + qa
default_env: 'qa',
default_id: '562095941'
},
'mycb-dev.mycollegeboard-nonprod.collegeboard.org': { //oak proxy + dev
default_env: 'dev',
default_id: '562095941'
},
'myap.collegeboard.org': { //APFYM_UI (prod)
default_id: '103101477',
default_sampling_rate: 2
},
'nsat.collegeboard.org': { //nsa
default_id: '80029318'
},
'opportunity.collegeboard.org': { //cbos prod
default_env: 'prod',
default_id: '175868436',
default_sampling_rate: 1,
prod: {
id: '175868436'
},
perf: {
id: '175175548'
},
uat: {
id: '175174977'
},
qa: {
id: '175174200'
},
dev: {
id: '175172753'
}
},
'opportunity.collegeplanning-prod.collegeboard.org': { //cbos prod
default_env: 'prod',
default_id: '175868436',
default_sampling_rate: 1
},
'opportunity-perf.collegeplanning-nonprod.collegeboard.org': { //cbos performance
default_env: 'perf',
default_id: '175175548'
},
'opportunity-staging.collegeplanning-nonprod.collegeboard.org': { //cbos staging
default_env: 'uat',
default_id: '175174977'
},
'opportunity-qa.collegeplanning-nonprod.collegeboard.org': { //cbos qa
default_env: 'qa',
default_id: '175174200'
},
'opportunity-dev.collegeplanning-nonprod.collegeboard.org': { //cbos dev
default_env: 'dev',
default_id: '175172753'
},
'pat.collegeboard.org': { //pat
default_id: '80505437'
},
'professionaltraining.collegeboard.org': { //paproftrain
default_id: '80247666'
},
/*'scores.collegeboard.org': { //aposre pawra
default_id: '80509631'
},*/
'scores.collegeboard.org': { //aposre cloud
default_env: 'prod',
default_id: '287194626',
default_sampling_rate: 1,
prod: {
id: '287194626'
},
perf: {
id: '287379809'
}
},
'perf-ui-reporting.aposre-nonprod.collegeboard.org': { //aposre cloud performance
default_env: 'perf',
default_id: '287379809'
},
'scorequateadmin.collegeboard.org': { //paequateadm
default_id: '80502823'
},
'scoreservices.collegeboard.org': { //pasccleanadm
default_id: '80502899'
},
'sendsatscores.collegeboard.org': {
default_env: 'prod',
default_id: '459720595',
//sampling_rate: 1, //WAP-4184, WAP-4261
prod: {
id: '459720595'//, //satscoresends, WAP-4010
//sampling_rate: 1 //WAP-4184, WAP-4261
},
uat: {
id: '459629530' //satscoresends-UAT, WAP-4010
},
qa: {
id: '459627699' //satscoresends-QA, WAP-4010
},
dev: {
id: '459627029' //satscoresends-DEV, WAP-4010
}
},
'sat-pascoresends-prod.collegeboard.org': { //satscoresends-PREPROD, WAP-4184
default_env: 'prod',
default_id: '459720595',
sampling_rate: 1
},
'scoresend-spruce.satscoresends-nonprod.collegeboard.org': { //satscoresends-UAT, WAP-4010
default_env: 'uat',
default_id: '459629530'
},
'scoresend-palm.satscoresends-nonprod.collegeboard.org': { //satscoresends-QA, WAP-4048
default_env: 'qa',
default_id: '459627699'
},
'scoresend-oak.satscoresends-nonprod.collegeboard.org': { //satscoresends-DEV, WAP-4048
default_env: 'dev',
default_id: '459627029'
},
'studentscores.collegeboard.org': { //pastdntscore, ssrcloud-prod
default_env: 'prod',
default_id: '325428138', //ssrcloud-prod
/*default_id: '80502477', //pastdntscore (legacy ssr app)
prod: {
id: '80502477'
},*/
prod: {
id: '325428138'
},
perf: {
id: '295440819'
},
uat: {
id: '295440585'
},
qa: {
id: '295440182'
},
dev: {
id: '295355610'
}
},
'ssr-portal-prod.reportingportal-prod.collegeboard.org': { //ssrcloud-prod
default_env: 'prod',
default_id: '325428138',
default_sampling_rate: 1
},
'ssr-portal-perf.reportingportal-nonprod.collegeboard.org': { //ssrcloud-perf
default_env: 'perf',
default_id: '295440819'
},
'ssr-portal-uat.reportingportal-nonprod.collegeboard.org': { //ssrcloud-uat
default_env: 'uat',
default_id: '295440585'
},
'ssr-portal-qa.reportingportal-nonprod.collegeboard.org': { //ssrcloud-qa
default_env: 'qa',
default_id: '295440182'
},
'ssr-portal-dev.reportingportal-nonprod.collegeboard.org': { //ssrcloud-dev
default_env: 'dev',
default_id: '295355610'
},
'testday.collegeboard.org': { //tdtk-prod
default_id: '403727162',
default_sampling_rate: 1,
prod: {
id: '403727162'
}
}
}
};
},"storeLength":"pageview"},
"Kiwi Config - Promos 2019": {"customJS":function(){
return {
'tout': [
'.tout a' //SSR Touts
],
'hero': [
'.cb-hero-standard .cb-hero-cta li:first-child .btn', //Apricot Standard Hero - Primary CTA
'.cb-hero-cta .cb-primary-cta' //Apricot Additional Hero Primary CTAs
],
'hero2': [
'.cb-hero-standard .cb-hero-cta li:nth-child(n+2) .btn', //Apricot Standard Hero - Secondary CTAs
'.cb-hero:not(.cb-hero-standard).cb-hero-cta .btn:not(.cb-primary-cta)' //Apricot Additional Secondary CTAs
],
'am': [
'.cb-anchor-menu .cb-cta-btn:last-child .btn' //Apricot Standard Anchor Menu - Primary CTA button
],
'ht': [
'.cb-hi-transactions a' //Apricot HTAs
],
'ue': [
'.cb-event a' //Apricot Upcoming Events
],
'fa': [
'.highlighted-articles a' //Apricot Featured Article
],
'sb': [
'.cb-sticky-bar .cb-sticky-cta .btn' //Apricot Sticky Bar CTA button
],
'sc': [
'.cb-item-list-showcase a' //Apricot Showcase Card
],
'card': [
'.card.panel .btn' //Apricot Card CTA Button, e.g. CBOS My Action Plan
],
'banner': [
'.lv-sitesearch-widget .lv-banner a', //site-search banner, general
'#searchResults .relatedSearches a', //site-search banner, aps
'.grid_9.omega .topRelatedSearch a', //site-search banner, bf
'#content.hasNavRail .productbox a' //site-search banner, legacy site-search template
],
'cta': [
'[data-cbtrack-promo="eps"]', //HEDR EPS CTA
'[data-cbtrack-promo="sss"]' //HEDR SSS CTA
],
'custom': [
'[data-cbtrack-promo]', //Special Request Promo Element
'[href*="prid="]', //Special Request Promo Element
'[data-cb-adcode]' //Special Request Promo Element
]
};
},"storeLength":"pageview"},
"Kiwi Config - Promos - Apricot Elements": {"customJS":function(){
/**
* Created by jbeach on 2017-10-11
* Updated by jbeach on 2018-12-04
*
* maps rendered css selectors parents to tracked promo/ad type codes
* promo-tracked elements which appear within the css selectors listed will use the mapped promo type code
* please be mindful of formatting in this file - it won't work even if a single quote or character is out of order
* more specific selectors (e.g. hero2) MUST appear in the list higher in order to track properly
*/
//var ruleName='KIWI: Data Element > Kiwi Config - Promos - Apricot Elements';
var val = [
['.cb-hero .cb-hero-cta li:nth-child(2) *', 'hero2'], //alternate hero
['.cb-hero *', 'hero'], //main hero button
['.cb-hi-transactionsband *', 'ht'], //highlighted transaction
['.cb-anchor-menu *', 'am'], //anchor menu
['.cb-event-band *', 'ue'], //upcoming event
['.cb-event-stacked *', 'ue'], //upcoming event
['.highlighted-articles *', 'fa'], //featured article
['.cb-item-list-showcase *', 'sc'], //showcase card
['.lv-sitesearch-widget .lv-banner a', 'banner'], //site-search banner, general
['#searchResults .relatedSearches a', 'banner'], //site-search banner, aps
['.grid_9.omega .topRelatedSearch a', 'banner'], //site-search banner, bf
['#content.hasNavRail .productbox a', 'banner'], //site-search banner, legacy site-search template
['.bg-section0 [data-cb-adcode]', 'viewp1'], //new bf home page (WAP-1896) - viewport area 1
['#signupDiv [data-cb-adcode]', 'viewp2'], //new bf home page (WAP-1896) - viewport area 2
];
//_satellite.notify(ruleName+': '+ val.length);
return val;
},"storeLength":"pageview"},
"Kiwi Config - Promos - Pages": {"customJS":function(){
/**
* Created by jbeach on 2017-10-16
* Updated by jbeach on 2017-10-20
*
* placeholder... maps rendered ?? to tracked page codes
*/
var ruleName='KIWI: Data Element > Kiwi Config - Promos - Pages';
var val = {};
//_satellite.notify(ruleName+': '+ val.length);
return val;
},"storeLength":"pageview"},
"Kiwi Config - Push Sites": {"customJS":function(){
/**
* Created by jbeach on 2018-01-17
* Updated by jbeach on 2020-01-28
*/
//var ruleName='KIWI: Data Element > Kiwi Config - Push Sites';
var val = {
'apac.collegeboard.org': {
idSite: '7774',
owner: '8fddb8e29b0b',
webpushid: 'web.84.aimtell.com'
},
'apcentral.collegeboard.org': {
idSite: '6137',
owner: '8fddb8e29b0b',
webpushid: 'web.69.aimtell.com'
},
'apcentral-stg.collegeboard.org': {
idSite: '6335',
owner: '8fddb8e29b0b',
webpushid: 'web.37.aimtell.com'
},
'apstudents.collegeboard.org': {
idSite: '18974',
owner: '8fddb8e29b0b',
webpushid: 'web.32.aimtell.com'
},
'apstudents-stg.collegeboard.org': {
idSite: '18975',
owner: '8fddb8e29b0b',
webpushid: 'web.87.aimtell.com'
},
'blog.collegeboard.org': {
idSite: '10450',
owner: '8fddb8e29b0b',
webpushid: 'web.34.aimtell.com'
},
'collegereadiness.collegeboard.org': {
idSite: '6136',
owner: '8fddb8e29b0b',
webpushid: 'web.67.aimtell.com'
},
'counselors.collegeboard.org': {
idSite: '8474',
owner: '8fddb8e29b0b',
webpushid: 'web.63.aimtell.com'
},
'dreamdeferred.collegeboard.org': {
idSite: '6421',
owner: '8fddb8e29b0b',
webpushid: 'web.75.aimtell.com'
},
'dreamdeferred-stg.collegeboard.org': {
idSite: '6420',
owner: '8fddb8e29b0b',
webpushid: 'web.57.aimtell.com'
},
'forum.collegeboard.org': {
idSite: '6244',
owner: '8fddb8e29b0b',
webpushid: 'web.99.aimtell.com'
},
'forum-stg.collegeboard.org': {
idSite: '6348',
owner: '8fddb8e29b0b',
webpushid: 'web.86.aimtell.com'
},
'middlestatesforum.collegeboard.org': {
idSite: '6417',
owner: '8fddb8e29b0b',
webpushid: 'web.74.aimtell.com'
},
'middlestatesforum-stg.collegeboard.org': {
idSite: '6414',
owner: '8fddb8e29b0b',
webpushid: 'web.73.aimtell.com'
},
'midwesternforum.collegeboard.org': {
idSite: '6409',
owner: '8fddb8e29b0b',
webpushid: 'web.64.aimtell.com'
},
'midwesternforum-stg.collegeboard.org': {
idSite: '6408',
owner: '8fddb8e29b0b',
webpushid: 'web.71.aimtell.com'
},
'nasai.collegeboard.org': {
idSite: '10255',
owner: '8fddb8e29b0b',
webpushid: 'web.48.aimtell.com'
},
'newenglandforum.collegeboard.org': {
idSite: '6419',
owner: '8fddb8e29b0b',
webpushid: 'web.58.aimtell.com'
},
'newenglandforum-stg.collegeboard.org': {
idSite: '6418',
owner: '8fddb8e29b0b',
webpushid: 'web.59.aimtell.com'