{"version":3,"sources":["webpack:///./node_modules/ahoy.js/dist/ahoy.esm.js","webpack:///./app/javascript/packs/ahoy.js"],"names":["Cookies","name","value","ttl","domain","expires","cookieDomain","date","Date","setTime","getTime","toGMTString","document","cookie","escape","i","c","nameEQ","ca","split","length","charAt","substring","indexOf","unescape","config","urlPrefix","visitsUrl","eventsUrl","page","platform","useBeacon","startOnReady","trackVisits","cookies","headers","visitParams","withCredentials","visitDuration","visitorDuration","ahoy","window","Ahoy","configure","options","key","hasOwnProperty","visitId","visitorId","track","callback","$","jQuery","Zepto","isReady","queue","canStringify","JSON","stringify","eventQueue","canTrackNow","trackNow","obj","Object","keys","navigator","sendBeacon","setCookie","getCookie","destroyCookie","log","message","console","setReady","shift","matchesSelector","element","selector","matches","mozMatchesSelector","msMatchesSelector","oMatchesSelector","webkitMatchesSelector","apply","parentElement","onEvent","eventName","addEventListener","e","matchedElement","target","call","generateId","replace","r","Math","random","toString","saveEventQueue","csrfToken","meta","querySelector","content","CSRFProtection","xhr","token","setRequestHeader","sendRequest","url","data","success","ajax","type","contentType","dataType","beforeSend","xhrFields","XMLHttpRequest","header","open","onload","status","send","eventData","event","events","visit_token","visitor_token","trackEvent","ready","id","splice","trackEventNow","param","events_json","object","FormData","append","serialize","location","pathname","presence","str","eventProperties","cleanObject","tag","this","tagName","toLowerCase","className","section","getClosestSection","parentNode","hasAttribute","getAttribute","createVisit","getVisitId","getVisitorId","landing_page","href","screen_width","screen","width","screen_height","height","js","referrer","push","getVisitToken","getVisitorToken","reset","debug","enabled","properties","time","setTimeout","trackView","additionalProperties","title","propName","trackClicks","undefined","Error","text","textContent","innerText","innerHTML","trim","trackSubmits","trackChanges","parse","start","readyState"],"mappings":";mGAQA,IAAIA,EACG,SAAaC,EAAMC,EAAOC,EAAKC,GAClC,IAAIC,EAAU,GACVC,EAAe,GAEnB,GAAIH,EAAK,CACP,IAAII,EAAO,IAAIC,KACfD,EAAKE,QAAQF,EAAKG,UAAkB,GAANP,EAAW,KACzCE,EAAU,aAAeE,EAAKI,cAG5BP,IACFE,EAAe,YAAcF,GAG/BQ,SAASC,OAASZ,EAAO,IAAMa,OAAOZ,GAASG,EAAUC,EAAe,0BAfxEN,EAiBG,SAAaC,GAChB,IAAIc,EAAGC,EACHC,EAAShB,EAAO,IAChBiB,EAAKN,SAASC,OAAOM,MAAM,KAE/B,IAAKJ,EAAI,EAAGA,EAAIG,EAAGE,OAAQL,IAAK,CAG9B,IAFAC,EAAIE,EAAGH,GAEgB,MAAhBC,EAAEK,OAAO,IACdL,EAAIA,EAAEM,UAAU,EAAGN,EAAEI,QAGvB,GAA0B,IAAtBJ,EAAEO,QAAQN,GACZ,OAAOO,SAASR,EAAEM,UAAUL,EAAOG,OAAQJ,EAAEI,SAIjD,OAAO,MAGPK,EAAS,CACXC,UAAW,GACXC,UAAW,eACXC,UAAW,eACXC,KAAM,KACNC,SAAU,MACVC,WAAW,EACXC,cAAc,EACdC,aAAa,EACbC,SAAS,EACT5B,aAAc,KACd6B,QAAS,GACTC,YAAa,GACbC,iBAAiB,EACjBC,cAAe,IAEfC,gBAAiB,SAGfC,EAAOC,OAAOD,MAAQC,OAAOC,MAAQ,GAEzCF,EAAKG,UAAY,SAAUC,GACzB,IAAK,IAAIC,KAAOD,EACVA,EAAQE,eAAeD,KACzBpB,EAAOoB,GAAOD,EAAQC,KAM5BL,EAAKG,UAAUH,GACf,IACIO,EAASC,EAAWC,EAmGDC,EApGnBC,EAAIV,OAAOW,QAAUX,OAAOY,OAASZ,OAAOU,EAE5CG,GAAU,EACVC,EAAQ,GACRC,EAA+B,qBAATC,MAAkD,qBAAnBA,KAAKC,UAC1DC,EAAa,GAMjB,SAAS/B,IACP,OAAOH,EAAOC,UAAYD,EAAOG,UAOnC,SAASgC,IACP,OAAQnC,EAAOM,WAAaN,EAAOoC,YALpBC,EAKyCrC,EAAOU,QAJ5B,IAA5B4B,OAAOC,KAAKF,GAAK1C,SAImDoC,GAAuD,qBAAhCf,OAAOwB,UAAUC,aAA+BzC,EAAOY,gBAL3J,IAAiByB,EAqBjB,SAASK,EAAUlE,EAAMC,EAAOC,GAC9BH,EAAYC,EAAMC,EAAOC,EAAKsB,EAAOnB,cAAgBmB,EAAOrB,QAG9D,SAASgE,EAAUnE,GACjB,OAAOD,EAAYC,GAGrB,SAASoE,EAAcpE,GACrBD,EAAYC,EAAM,IAAK,GAGzB,SAASqE,EAAIC,GACPH,EAAU,eACZ3B,OAAO+B,QAAQF,IAAIC,GAIvB,SAASE,IAGP,IAFA,IAAIvB,EAEGA,EAAWK,EAAMmB,SACtBxB,IAGFI,GAAU,EAWZ,SAASqB,EAAgBC,EAASC,GAChC,IAAIC,EAAUF,EAAQE,SAAWF,EAAQD,iBAAmBC,EAAQG,oBAAsBH,EAAQI,mBAAqBJ,EAAQK,kBAAoBL,EAAQM,sBAE3J,OAAIJ,EACEA,EAAQK,MAAMP,EAAS,CAACC,IACnBD,EACEA,EAAQQ,cACVT,EAAgBC,EAAQQ,cAAeP,GAGzC,MAEPP,EAAI,mBACG,MAIX,SAASe,EAAQC,EAAWT,EAAU3B,GACpCtC,SAAS2E,iBAAiBD,GAAW,SAAUE,GAC7C,IAAIC,EAAiBd,EAAgBa,EAAEE,OAAQb,GAE3CY,GACFvC,EAASyC,KAAKF,EAAgBD,MAepC,SAASI,IACP,MAAO,uCAAuCC,QAAQ,SAAS,SAAU7E,GACvE,IAAI8E,EAAoB,GAAhBC,KAAKC,SAAgB,EAE7B,OADa,KAALhF,EAAW8E,EAAQ,EAAJA,EAAU,GACxBG,SAAS,OAItB,SAASC,IACHzE,EAAOS,SAAWsB,GACpBW,EAAU,cAAeV,KAAKC,UAAUC,GAAa,GAKzD,SAASwC,IACP,IAAIC,EAAOxF,SAASyF,cAAc,yBAClC,OAAOD,GAAQA,EAAKE,QAQtB,SAASC,EAAeC,GACtB,IAAIC,EAAQN,IAERM,GACFD,EAAIE,iBAAiB,eAAgBD,GAIzC,SAASE,EAAYC,EAAKC,EAAMC,GAC9B,GAAItD,EACF,GAAIL,GAAKA,EAAE4D,KACT5D,EAAE4D,KAAK,CACLC,KAAM,OACNJ,IAAKA,EACLC,KAAMpD,KAAKC,UAAUmD,GACrBI,YAAa,kCACbC,SAAU,OACVC,WAAYZ,EACZO,QAASA,EACT3E,QAASV,EAAOU,QAChBiF,UAAW,CACT/E,gBAAiBZ,EAAOY,uBAGvB,CACL,IAAImE,EAAM,IAAIa,eAKd,IAAK,IAAIC,KAJTd,EAAIe,KAAK,OAAQX,GAAK,GACtBJ,EAAInE,gBAAkBZ,EAAOY,gBAC7BmE,EAAIE,iBAAiB,eAAgB,oBAElBjF,EAAOU,QACpBV,EAAOU,QAAQW,eAAewE,IAChCd,EAAIE,iBAAiBY,EAAQ7F,EAAOU,QAAQmF,IAIhDd,EAAIgB,OAAS,WACQ,MAAfhB,EAAIiB,QACNX,KAIJP,EAAeC,GACfA,EAAIkB,KAAKjE,KAAKC,UAAUmD,KAK9B,SAASc,EAAUC,GACjB,IAAIf,EAAO,CACTgB,OAAQ,CAACD,IAUX,OAPInG,EAAOS,UACT2E,EAAKiB,YAAcF,EAAME,YACzBjB,EAAKkB,cAAgBH,EAAMG,sBAGtBH,EAAME,mBACNF,EAAMG,cACNlB,EAGT,SAASmB,EAAWJ,GAClBpF,EAAKyF,OAAM,WACTtB,EAAY/E,IAAa+F,EAAUC,IAAQ,WAEzC,IAAK,IAAI7G,EAAI,EAAGA,EAAI4C,EAAWvC,OAAQL,IACrC,GAAI4C,EAAW5C,GAAGmH,IAAMN,EAAMM,GAAI,CAChCvE,EAAWwE,OAAOpH,EAAG,GACrB,MAIJmF,UAKN,SAASkC,EAAcR,GACrBpF,EAAKyF,OAAM,WACT,IArFE7B,EAqFES,EAAOc,EAAUC,GACjBS,GAtFFjC,EAAOxF,SAASyF,cAAc,2BACnBD,EAAKE,QAsFdG,EAAQN,IAERkC,GAAS5B,IACXI,EAAKwB,GAAS5B,GAIhBI,EAAKyB,YAAc7E,KAAKC,UAAUmD,EAAKgB,eAChChB,EAAKgB,OACZpF,OAAOwB,UAAUC,WAAWtC,IA3MhC,SAAmB2G,GACjB,IAAI1B,EAAO,IAAI2B,SAEf,IAAK,IAAI3F,KAAO0F,EACVA,EAAOzF,eAAeD,IACxBgE,EAAK4B,OAAO5F,EAAK0F,EAAO1F,IAI5B,OAAOgE,EAkMoC6B,CAAU7B,OAIvD,SAAShF,IACP,OAAOJ,EAAOI,MAAQY,OAAOkG,SAASC,SAGxC,SAASC,EAASC,GAChB,OAAOA,GAAOA,EAAI1H,OAAS,EAAI0H,EAAM,KAevC,SAASC,IACP,OAbF,SAAqBjF,GACnB,IAAK,IAAIjB,KAAOiB,EACVA,EAAIhB,eAAeD,IACJ,OAAbiB,EAAIjB,WACCiB,EAAIjB,GAKjB,OAAOiB,EAIAkF,CAAY,CACjBC,IAAKC,KAAKC,QAAQC,cAClBlB,GAAIW,EAASK,KAAKhB,IAClB,MAASW,EAASK,KAAKG,WACvBxH,KAAMA,IACNyH,QAASC,EAAkBL,QAI/B,SAASK,EAAkB3E,GACzB,KAAOA,GAAWA,IAAYhE,SAAUgE,EAAUA,EAAQ4E,WACxD,GAAI5E,EAAQ6E,aAAa,gBACvB,OAAO7E,EAAQ8E,aAAa,gBAIhC,OAAO,KAGT,SAASC,IAMP,GALArG,GAAU,EACVP,EAAUP,EAAKoH,aACf5G,EAAYR,EAAKqH,eACjB5G,EAAQmB,EAAU,eAEK,IAAnB3C,EAAOS,UAA4C,IAAvBT,EAAOQ,YACrCqC,EAAI,2BACJG,SACK,GAAI1B,GAAWC,IAAcC,EAElCqB,EAAI,gBACJG,SAQA,GANK1B,GAEHoB,EAAU,aADVpB,EAAU6C,IACuBnE,EAAOa,eAItC8B,EAAU,cAAe,CAC3BE,EAAI,iBAECtB,GAEHmB,EAAU,eADVnB,EAAY4C,IACyBnE,EAAOc,iBAG9C,IAAIsE,EAAO,CACTiB,YAAa/E,EACbgF,cAAe/E,EACflB,SAAUL,EAAOK,SACjBgI,aAAcrH,OAAOkG,SAASoB,KAC9BC,aAAcvH,OAAOwH,OAAOC,MAC5BC,cAAe1H,OAAOwH,OAAOG,OAC7BC,IAAI,GAON,IAAK,IAAIxH,KAJLjC,SAAS0J,SAASlJ,OAAS,IAC7ByF,EAAKyD,SAAW1J,SAAS0J,UAGX7I,EAAOW,YACjBX,EAAOW,YAAYU,eAAeD,KACpCgE,EAAKhE,GAAOpB,EAAOW,YAAYS,IAInCyB,EAAIuC,GACJF,EAvTGlF,EAAOC,UAAYD,EAAOE,UAuTJkF,GAAM,WAE7BxC,EAAc,cACdI,YAGFH,EAAI,oBACJG,IAtQNjC,EAAKyF,MAAQ,SAAU/E,GACjBI,EACFJ,IAEAK,EAAMgH,KAAKrH,IAuQfV,EAAKoH,WAAapH,EAAKgI,cAAgB,WACrC,OAAOpG,EAAU,eAGnB5B,EAAKqH,aAAerH,EAAKiI,gBAAkB,WACzC,OAAOrG,EAAU,iBAGnB5B,EAAKkI,MAAQ,WAKX,OAJArG,EAAc,cACdA,EAAc,gBACdA,EAAc,eACdA,EAAc,eACP,GAGT7B,EAAKmI,MAAQ,SAAUC,GAOrB,OANgB,IAAZA,EACFvG,EAAc,cAEdF,EAAU,aAAc,IAAK,SAGxB,GAGT3B,EAAKS,MAAQ,SAAUhD,EAAM4K,GAE3B,IAAIjD,EAAQ,CACV3H,KAAMA,EACN4K,WAAYA,GAAc,GAC1BC,MAAM,IAAItK,MAAOE,UAAY,IAC7BwH,GAAItC,IACJyE,IAAI,GAwBN,OAtBA7H,EAAKyF,OAAM,WACLxG,EAAOS,UAAYM,EAAKoH,cAC1BD,IAGFnH,EAAKyF,OAAM,WACT3D,EAAIsD,GACJA,EAAME,YAActF,EAAKoH,aACzBhC,EAAMG,cAAgBvF,EAAKqH,eAEvBjG,IACFwE,EAAcR,IAEdjE,EAAW4G,KAAK3C,GAChB1B,IAEA6E,YAAW,WACT/C,EAAWJ,KACV,aAIF,GAGTpF,EAAKwI,UAAY,SAAUC,GACzB,IAAIJ,EAAa,CACfjE,IAAKnE,OAAOkG,SAASoB,KACrBmB,MAAOtK,SAASsK,MAChBrJ,KAAMA,KAGR,GAAIoJ,EACF,IAAK,IAAIE,KAAYF,EACfA,EAAqBnI,eAAeqI,KACtCN,EAAWM,GAAYF,EAAqBE,IAKlD3I,EAAKS,MAAM,QAAS4H,IAGtBrI,EAAK4I,YAAc,SAAUvG,GAC3B,QAAiBwG,IAAbxG,EACF,MAAM,IAAIyG,MAAM,oBAGlBjG,EAAQ,QAASR,GAAU,SAAUW,GACnC,IAAIqF,EAAa9B,EAAgBpD,KAAKuD,KAAM1D,GAC5CqF,EAAWU,KAAyB,SAAlBV,EAAW5B,IAAiBC,KAAKhJ,OAASgJ,KAAKsC,aAAetC,KAAKuC,WAAavC,KAAKwC,WAAW7F,QAAQ,aAAc,KAAK8F,OAC7Id,EAAWd,KAAOb,KAAKa,KACvBvH,EAAKS,MAAM,SAAU4H,OAIzBrI,EAAKoJ,aAAe,SAAU/G,GAC5B,QAAiBwG,IAAbxG,EACF,MAAM,IAAIyG,MAAM,oBAGlBjG,EAAQ,SAAUR,GAAU,SAAUW,GACpC,IAAIqF,EAAa9B,EAAgBpD,KAAKuD,KAAM1D,GAC5ChD,EAAKS,MAAM,UAAW4H,OAI1BrI,EAAKqJ,aAAe,SAAUhH,GAG5B,GAFAP,EAAI,gEAEa+G,IAAbxG,EACF,MAAM,IAAIyG,MAAM,oBAGlBjG,EAAQ,SAAUR,GAAU,SAAUW,GACpC,IAAIqF,EAAa9B,EAAgBpD,KAAKuD,KAAM1D,GAC5ChD,EAAKS,MAAM,UAAW4H,OAK1B,IACElH,EAAaF,KAAKqI,MAAM1H,EAAU,gBAAkB,MACpD,MAAOoB,IAGT,IAAK,IAAIzE,EAAI,EAAGA,EAAI4C,EAAWvC,OAAQL,IACrCiH,EAAWrE,EAAW5C,IAGxByB,EAAKuJ,MAAQ,WACXpC,IAEAnH,EAAKuJ,MAAQ,cAvWQ7I,EA0WT,WACRzB,EAAOO,cACTQ,EAAKuJ,SA3WqB,gBAAxBnL,SAASoL,YAAwD,aAAxBpL,SAASoL,WACpDjB,WAAW7H,EAAU,GAErBtC,SAAS2E,iBAAiB,mBAAoBrC,GA2WnC,QC7hBfV,EAAKG,UAAU,CACbhB,UAAW,eACXC,UAAW,iBAGbY,EAAK4I,YAAY,uBACjB5I,EAAKoJ,aAAa,QAClBhL,SAAS2E,iBAAiB,mBAAmB,WAC3C/C,EAAKwI,iB","file":"js/ahoy-a43fa17eddf45d98a791.chunk.js","sourcesContent":["/*!\n * Ahoy.js\n * Simple, powerful JavaScript analytics\n * https://github.com/ankane/ahoy.js\n * v0.4.0\n * MIT License\n */\n// https://www.quirksmode.org/js/cookies.html\nvar Cookies = {\n set: function set(name, value, ttl, domain) {\n var expires = \"\";\n var cookieDomain = \"\";\n\n if (ttl) {\n var date = new Date();\n date.setTime(date.getTime() + ttl * 60 * 1000);\n expires = \"; expires=\" + date.toGMTString();\n }\n\n if (domain) {\n cookieDomain = \"; domain=\" + domain;\n }\n\n document.cookie = name + \"=\" + escape(value) + expires + cookieDomain + \"; path=/; samesite=lax\";\n },\n get: function get(name) {\n var i, c;\n var nameEQ = name + \"=\";\n var ca = document.cookie.split(';');\n\n for (i = 0; i < ca.length; i++) {\n c = ca[i];\n\n while (c.charAt(0) === ' ') {\n c = c.substring(1, c.length);\n }\n\n if (c.indexOf(nameEQ) === 0) {\n return unescape(c.substring(nameEQ.length, c.length));\n }\n }\n\n return null;\n }\n};\nvar config = {\n urlPrefix: \"\",\n visitsUrl: \"/ahoy/visits\",\n eventsUrl: \"/ahoy/events\",\n page: null,\n platform: \"Web\",\n useBeacon: true,\n startOnReady: true,\n trackVisits: true,\n cookies: true,\n cookieDomain: null,\n headers: {},\n visitParams: {},\n withCredentials: false,\n visitDuration: 4 * 60,\n // default 4 hours\n visitorDuration: 2 * 365 * 24 * 60 // default 2 years\n\n};\nvar ahoy = window.ahoy || window.Ahoy || {};\n\nahoy.configure = function (options) {\n for (var key in options) {\n if (options.hasOwnProperty(key)) {\n config[key] = options[key];\n }\n }\n}; // legacy\n\n\nahoy.configure(ahoy);\nvar $ = window.jQuery || window.Zepto || window.$;\nvar visitId, visitorId, track;\nvar isReady = false;\nvar queue = [];\nvar canStringify = typeof JSON !== \"undefined\" && typeof JSON.stringify !== \"undefined\";\nvar eventQueue = [];\n\nfunction visitsUrl() {\n return config.urlPrefix + config.visitsUrl;\n}\n\nfunction eventsUrl() {\n return config.urlPrefix + config.eventsUrl;\n}\n\nfunction isEmpty(obj) {\n return Object.keys(obj).length === 0;\n}\n\nfunction canTrackNow() {\n return (config.useBeacon || config.trackNow) && isEmpty(config.headers) && canStringify && typeof window.navigator.sendBeacon !== \"undefined\" && !config.withCredentials;\n}\n\nfunction serialize(object) {\n var data = new FormData();\n\n for (var key in object) {\n if (object.hasOwnProperty(key)) {\n data.append(key, object[key]);\n }\n }\n\n return data;\n} // cookies\n\n\nfunction setCookie(name, value, ttl) {\n Cookies.set(name, value, ttl, config.cookieDomain || config.domain);\n}\n\nfunction getCookie(name) {\n return Cookies.get(name);\n}\n\nfunction destroyCookie(name) {\n Cookies.set(name, \"\", -1);\n}\n\nfunction log(message) {\n if (getCookie(\"ahoy_debug\")) {\n window.console.log(message);\n }\n}\n\nfunction setReady() {\n var callback;\n\n while (callback = queue.shift()) {\n callback();\n }\n\n isReady = true;\n}\n\nahoy.ready = function (callback) {\n if (isReady) {\n callback();\n } else {\n queue.push(callback);\n }\n};\n\nfunction matchesSelector(element, selector) {\n var matches = element.matches || element.matchesSelector || element.mozMatchesSelector || element.msMatchesSelector || element.oMatchesSelector || element.webkitMatchesSelector;\n\n if (matches) {\n if (matches.apply(element, [selector])) {\n return element;\n } else if (element.parentElement) {\n return matchesSelector(element.parentElement, selector);\n }\n\n return null;\n } else {\n log(\"Unable to match\");\n return null;\n }\n}\n\nfunction onEvent(eventName, selector, callback) {\n document.addEventListener(eventName, function (e) {\n var matchedElement = matchesSelector(e.target, selector);\n\n if (matchedElement) {\n callback.call(matchedElement, e);\n }\n });\n} // http://beeker.io/jquery-document-ready-equivalent-vanilla-javascript\n\n\nfunction documentReady(callback) {\n if (document.readyState === \"interactive\" || document.readyState === \"complete\") {\n setTimeout(callback, 0);\n } else {\n document.addEventListener(\"DOMContentLoaded\", callback);\n }\n} // https://stackoverflow.com/a/2117523/1177228\n\n\nfunction generateId() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n var r = Math.random() * 16 | 0,\n v = c == 'x' ? r : r & 0x3 | 0x8;\n return v.toString(16);\n });\n}\n\nfunction saveEventQueue() {\n if (config.cookies && canStringify) {\n setCookie(\"ahoy_events\", JSON.stringify(eventQueue), 1);\n }\n} // from rails-ujs\n\n\nfunction csrfToken() {\n var meta = document.querySelector(\"meta[name=csrf-token]\");\n return meta && meta.content;\n}\n\nfunction csrfParam() {\n var meta = document.querySelector(\"meta[name=csrf-param]\");\n return meta && meta.content;\n}\n\nfunction CSRFProtection(xhr) {\n var token = csrfToken();\n\n if (token) {\n xhr.setRequestHeader(\"X-CSRF-Token\", token);\n }\n}\n\nfunction sendRequest(url, data, success) {\n if (canStringify) {\n if ($ && $.ajax) {\n $.ajax({\n type: \"POST\",\n url: url,\n data: JSON.stringify(data),\n contentType: \"application/json; charset=utf-8\",\n dataType: \"json\",\n beforeSend: CSRFProtection,\n success: success,\n headers: config.headers,\n xhrFields: {\n withCredentials: config.withCredentials\n }\n });\n } else {\n var xhr = new XMLHttpRequest();\n xhr.open(\"POST\", url, true);\n xhr.withCredentials = config.withCredentials;\n xhr.setRequestHeader(\"Content-Type\", \"application/json\");\n\n for (var header in config.headers) {\n if (config.headers.hasOwnProperty(header)) {\n xhr.setRequestHeader(header, config.headers[header]);\n }\n }\n\n xhr.onload = function () {\n if (xhr.status === 200) {\n success();\n }\n };\n\n CSRFProtection(xhr);\n xhr.send(JSON.stringify(data));\n }\n }\n}\n\nfunction eventData(event) {\n var data = {\n events: [event]\n };\n\n if (config.cookies) {\n data.visit_token = event.visit_token;\n data.visitor_token = event.visitor_token;\n }\n\n delete event.visit_token;\n delete event.visitor_token;\n return data;\n}\n\nfunction trackEvent(event) {\n ahoy.ready(function () {\n sendRequest(eventsUrl(), eventData(event), function () {\n // remove from queue\n for (var i = 0; i < eventQueue.length; i++) {\n if (eventQueue[i].id == event.id) {\n eventQueue.splice(i, 1);\n break;\n }\n }\n\n saveEventQueue();\n });\n });\n}\n\nfunction trackEventNow(event) {\n ahoy.ready(function () {\n var data = eventData(event);\n var param = csrfParam();\n var token = csrfToken();\n\n if (param && token) {\n data[param] = token;\n } // stringify so we keep the type\n\n\n data.events_json = JSON.stringify(data.events);\n delete data.events;\n window.navigator.sendBeacon(eventsUrl(), serialize(data));\n });\n}\n\nfunction page() {\n return config.page || window.location.pathname;\n}\n\nfunction presence(str) {\n return str && str.length > 0 ? str : null;\n}\n\nfunction cleanObject(obj) {\n for (var key in obj) {\n if (obj.hasOwnProperty(key)) {\n if (obj[key] === null) {\n delete obj[key];\n }\n }\n }\n\n return obj;\n}\n\nfunction eventProperties() {\n return cleanObject({\n tag: this.tagName.toLowerCase(),\n id: presence(this.id),\n \"class\": presence(this.className),\n page: page(),\n section: getClosestSection(this)\n });\n}\n\nfunction getClosestSection(element) {\n for (; element && element !== document; element = element.parentNode) {\n if (element.hasAttribute('data-section')) {\n return element.getAttribute('data-section');\n }\n }\n\n return null;\n}\n\nfunction createVisit() {\n isReady = false;\n visitId = ahoy.getVisitId();\n visitorId = ahoy.getVisitorId();\n track = getCookie(\"ahoy_track\");\n\n if (config.cookies === false || config.trackVisits === false) {\n log(\"Visit tracking disabled\");\n setReady();\n } else if (visitId && visitorId && !track) {\n // TODO keep visit alive?\n log(\"Active visit\");\n setReady();\n } else {\n if (!visitId) {\n visitId = generateId();\n setCookie(\"ahoy_visit\", visitId, config.visitDuration);\n } // make sure cookies are enabled\n\n\n if (getCookie(\"ahoy_visit\")) {\n log(\"Visit started\");\n\n if (!visitorId) {\n visitorId = generateId();\n setCookie(\"ahoy_visitor\", visitorId, config.visitorDuration);\n }\n\n var data = {\n visit_token: visitId,\n visitor_token: visitorId,\n platform: config.platform,\n landing_page: window.location.href,\n screen_width: window.screen.width,\n screen_height: window.screen.height,\n js: true\n }; // referrer\n\n if (document.referrer.length > 0) {\n data.referrer = document.referrer;\n }\n\n for (var key in config.visitParams) {\n if (config.visitParams.hasOwnProperty(key)) {\n data[key] = config.visitParams[key];\n }\n }\n\n log(data);\n sendRequest(visitsUrl(), data, function () {\n // wait until successful to destroy\n destroyCookie(\"ahoy_track\");\n setReady();\n });\n } else {\n log(\"Cookies disabled\");\n setReady();\n }\n }\n}\n\nahoy.getVisitId = ahoy.getVisitToken = function () {\n return getCookie(\"ahoy_visit\");\n};\n\nahoy.getVisitorId = ahoy.getVisitorToken = function () {\n return getCookie(\"ahoy_visitor\");\n};\n\nahoy.reset = function () {\n destroyCookie(\"ahoy_visit\");\n destroyCookie(\"ahoy_visitor\");\n destroyCookie(\"ahoy_events\");\n destroyCookie(\"ahoy_track\");\n return true;\n};\n\nahoy.debug = function (enabled) {\n if (enabled === false) {\n destroyCookie(\"ahoy_debug\");\n } else {\n setCookie(\"ahoy_debug\", \"t\", 365 * 24 * 60); // 1 year\n }\n\n return true;\n};\n\nahoy.track = function (name, properties) {\n // generate unique id\n var event = {\n name: name,\n properties: properties || {},\n time: new Date().getTime() / 1000.0,\n id: generateId(),\n js: true\n };\n ahoy.ready(function () {\n if (config.cookies && !ahoy.getVisitId()) {\n createVisit();\n }\n\n ahoy.ready(function () {\n log(event);\n event.visit_token = ahoy.getVisitId();\n event.visitor_token = ahoy.getVisitorId();\n\n if (canTrackNow()) {\n trackEventNow(event);\n } else {\n eventQueue.push(event);\n saveEventQueue(); // wait in case navigating to reduce duplicate events\n\n setTimeout(function () {\n trackEvent(event);\n }, 1000);\n }\n });\n });\n return true;\n};\n\nahoy.trackView = function (additionalProperties) {\n var properties = {\n url: window.location.href,\n title: document.title,\n page: page()\n };\n\n if (additionalProperties) {\n for (var propName in additionalProperties) {\n if (additionalProperties.hasOwnProperty(propName)) {\n properties[propName] = additionalProperties[propName];\n }\n }\n }\n\n ahoy.track(\"$view\", properties);\n};\n\nahoy.trackClicks = function (selector) {\n if (selector === undefined) {\n throw new Error(\"Missing selector\");\n }\n\n onEvent(\"click\", selector, function (e) {\n var properties = eventProperties.call(this, e);\n properties.text = properties.tag == \"input\" ? this.value : (this.textContent || this.innerText || this.innerHTML).replace(/[\\s\\r\\n]+/g, \" \").trim();\n properties.href = this.href;\n ahoy.track(\"$click\", properties);\n });\n};\n\nahoy.trackSubmits = function (selector) {\n if (selector === undefined) {\n throw new Error(\"Missing selector\");\n }\n\n onEvent(\"submit\", selector, function (e) {\n var properties = eventProperties.call(this, e);\n ahoy.track(\"$submit\", properties);\n });\n};\n\nahoy.trackChanges = function (selector) {\n log(\"trackChanges is deprecated and will be removed in 0.5.0\");\n\n if (selector === undefined) {\n throw new Error(\"Missing selector\");\n }\n\n onEvent(\"change\", selector, function (e) {\n var properties = eventProperties.call(this, e);\n ahoy.track(\"$change\", properties);\n });\n}; // push events from queue\n\n\ntry {\n eventQueue = JSON.parse(getCookie(\"ahoy_events\") || \"[]\");\n} catch (e) {// do nothing\n}\n\nfor (var i = 0; i < eventQueue.length; i++) {\n trackEvent(eventQueue[i]);\n}\n\nahoy.start = function () {\n createVisit();\n\n ahoy.start = function () {};\n};\n\ndocumentReady(function () {\n if (config.startOnReady) {\n ahoy.start();\n }\n});\nexport default ahoy;","import ahoy from 'ahoy.js';\n\nahoy.configure({\n visitsUrl: '/info/visits',\n eventsUrl: '/info/events',\n});\n\nahoy.trackClicks('a, .btn, .clickable');\nahoy.trackSubmits('form');\ndocument.addEventListener('turbolinks:load', () => {\n ahoy.trackView();\n});\n"],"sourceRoot":""}