{"version":3,"sources":["main.js"],"names":["gaeMapper","ga_options","makeSelector","click_option","selector","type","name","clickElementsFromDB","click_elements_from_options","click_elements","i","length","clicked","nonInteraction","newClickElement","bounce","data","select","category","action","label","evalue","value","link_click_delay","parseInt","link_clicks_delay","universal","push","scroll_elements_from_options","scroll_elements","scrollElementsFromDB","forEach","el","advancedMode","advanced","forceSnippet","force_snippet","emailLinksTracking","email_link_tracking","telLinksTracking","tel_link_tracking","downloadTracking","download_tracking","downloadTrackingFileTypes","download_tracking_type","snippet_type","isFrontPage","gaePlaceholders","is_front_page","pageTitle","page_title","scriptDebugMode","script_debug_mode","gaEventsMain","$","ga_element","bindScrollEventsFromDB","$select","ga_window","window","height","ga_scroll_top","document","scrollTop","sent","offset","top","track_event","ready","on","click_event","ftype","lowercase","toLowerCase","uppercase","toUpperCase","trackFileDownloaded","e","preventDefault","this","href","split","pop","getPageName","handleLinks","ga","_gaq","__gaTracker","gaplusu","dataLayer","event_value","event_bounce","useGlobalSiteTagSnippet","globalSiteTagEvent","useGoogleTagManagerSnippet","googleTagManagerEvent","useUniversalTrackingSnippet","universalTrackingEvent","useLegacySnippet","legacyTrackingEvent","gtag","event","eventCategory","eventAction","eventLabel","eventValue","event_category","event_label","non_interaction","target","nodeName","self","w","link","getUrl","openInNewTab","attr","trim","isNewTab","hash","open","isJustHashLink","location","setTimeout","tagName","parents","url","indexOf","jQuery"],"mappings":"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","file":"frontend-scripts.min.js","sourcesContent":["// noinspection JSVoidFunctionReturnValueUsed\n\n/*\n * Main GA Events Plugin function\n * \n * TO DO: all variables with gaeMapper. prefix can be declared at top of function \n * and have prefix removed thereafter. Although for now it could be helpful to \n * keep prefix to make it obvious which values need to eventually be accessed \n * directly from localized values.\n * \n * Exposes track_event, click_event\n * \n * Global: TO DO\n */\nvar gaeMapper = (function () {\n\n // Make sure options are present globally\n if (typeof ga_options !== \"undefined\") {\n\n /*\n * We temporarily need to be able to create a selector of type id or class\n * from the existing DB options.\n *\n * Eventually we will probably update the backend to store the selector as an\n * option within the associative \"click\" (or otherwise named) array\n *\n * @param {sequential array}\n */\n function makeSelector(click_option) {\n var selector = \"\";\n if (click_option.type === 'class') {\n selector += '.';\n } else if (click_option.type === 'id') {\n selector += '#';\n }\n\n selector += click_option.name;\n return selector;\n }\n\n // Click elements from DB section begins\n // TO DO clean up this code a bit to make it more like the scroll elements\n // from DB section\n var clickElementsFromDB = [];\n\n var click_elements_from_options = ga_options.click_elements;\n for (var i = 0; i < click_elements_from_options.length; i++) {\n\n var clicked = click_elements_from_options[i];\n newClickElement = {};\n\n var nonInteraction = (clicked.bounce === \"true\");\n newClickElement.data = {\n \"select\": makeSelector(clicked),\n \"category\": clicked.category,\n \"action\": clicked.action,\n \"label\": clicked.label,\n \"bounce\": nonInteraction,\n \"evalue\": clicked.value, // \"value\" in DB. Change in project?\n \"link_click_delay\": parseInt(ga_options.link_clicks_delay),\n \"universal\": parseInt(ga_options.universal)\n };\n\n // NB was unescapeChars(select) (from original js file)\n newClickElement.selector = newClickElement.data.select;\n clickElementsFromDB.push(newClickElement);\n }\n\n // Click elements from DB section ends\n\n // Scrollelements from DB section begins\n\n var scroll_elements_from_options = ga_options.scroll_elements;\n var scrollElementsFromDB = [];\n\n // NB these will be assigned meaningful names in backend eventually\n if (typeof scroll_elements_from_options !== \"undefined\") {\n scroll_elements_from_options.forEach(function (el) {\n var nonInteraction = (el.bounce === \"true\");\n\n scrollElementsFromDB.push({\n \"select\": makeSelector(el),\n \"category\": el.category,\n \"action\": el.action,\n \"label\": el.label,\n \"bounce\": nonInteraction,\n \"evalue\": el.value // \"value\" in DB. Change in project?\n });\n });\n }\n\n // Scrollelements from DB section ends\n\n // Expose modified properties to global scope\n return {\n\n // From ga_options\n clickElementsFromDB: clickElementsFromDB,\n scrollElementsFromDB: scrollElementsFromDB,\n advancedMode: ga_options.advanced,\n forceSnippet: ga_options.force_snippet,\n emailLinksTracking: ga_options.email_link_tracking,\n telLinksTracking: ga_options.tel_link_tracking,\n downloadTracking: ga_options.download_tracking,\n downloadTrackingFileTypes: ga_options.download_tracking_type,\n link_clicks_delay: ga_options.link_clicks_delay,\n snippet_type: ga_options.snippet_type,\n isFrontPage: gaePlaceholders.is_front_page,\n pageTitle: gaePlaceholders.page_title,\n scriptDebugMode: ga_options.script_debug_mode,\n }\n\n\n } // end if\n\n})();\n\n\ngaEventsMain = (function ($) {\n\n \"use strict\";\n\n // This is the tracking element.\n // It could already have been created by another plugin.\n var ga_element;\n\n $(document).ready(function () {\n\n // TO DO: This needs to be conditional on non-excluded roles!\n // (Another export from mapper is probably the best way to get these\n // at the current stage.)\n applyBindings();\n });\n\n /*\n * Apply bindings from values stored in DB\n */\n function applyBindings() {\n\n // Bind click events stored in DB to the DOM body\n // \"clicked is the data which gets passed to the click_event function\n // \"selector\" is the id or class of the element clicked\n gaeMapper.clickElementsFromDB.forEach(function (el) {\n\n $('body').on('click', el.selector, el.data, click_event);\n });\n\n bindDownloadTrackingEvents();\n bindEmailLinksTracking();\n bindTelLinksTracking();\n // Bind scroll events stored in the DB to the window\n $(window).on('scroll', bindScrollEventsFromDB);\n }\n\n /**\n * Binds Scroll events from DB\n *\n * @returns {undefined}\n */\n function bindScrollEventsFromDB() {\n\n // TO DO this code can be simplified a lot. May be better to use\n // $('element').scroll()\n\n var ga_window = $(window).height();\n var ga_scroll_top = $(document).scrollTop();\n\n for (var i = 0; i < gaeMapper.scrollElementsFromDB.length; i++) {\n\n if (!gaeMapper.scrollElementsFromDB[i].sent) {\n\n // NB was unescapeChars( gaeMapper.scrollElementsFromDB[i].select)\n var $select = $(gaeMapper.scrollElementsFromDB[i].select);\n gaeMapper.scrollElementsFromDB[i].offset = $select.offset();\n\n if (gaeMapper.scrollElementsFromDB[i].offset && ga_scroll_top + ga_window >= gaeMapper.scrollElementsFromDB[i].offset.top + $select.height()) {\n track_event(gaeMapper.scrollElementsFromDB[i].category, gaeMapper.scrollElementsFromDB[i].action, gaeMapper.scrollElementsFromDB[i].label, gaeMapper.scrollElementsFromDB[i].bounce, gaeMapper.scrollElementsFromDB[i].evalue);\n\n gaeMapper.scrollElementsFromDB[i].sent = true;\n }\n }\n }\n }\n\n /**\n * Binds Download Tracking\n *\n * @returns {undefined}\n */\n function bindDownloadTrackingEvents() {\n if (gaeMapper.downloadTracking === \"1\") {\n gaeMapper.downloadTrackingFileTypes.forEach(function (ftype) {\n var lowercase = ftype.toLowerCase();\n var uppercase = ftype.toUpperCase();\n\n $('body').on('click', 'a[href$=\".' + lowercase + '\"]', trackFileDownloaded);\n $('body').on('click', 'a[href$=\".' + uppercase + '\"]', trackFileDownloaded);\n });\n }\n } // End of bindScrollEvents\n\n function bindEmailLinksTracking() {\n if (gaeMapper.emailLinksTracking === \"1\") {\n $('body').on('click', 'a[href^=\"mailto:\"]', function (e) {\n e.preventDefault();\n var label = this.href.split(':').pop();\n var action = \"Email Link\";\n var category = getPageName();\n track_event(category,action,label,false, \"\");\n handleLinks(this, e);\n });\n }\n }\n\n function bindTelLinksTracking() {\n if (gaeMapper.telLinksTracking === \"1\") {\n $('body').on('click', 'a[href^=\"tel:\"]', function (e) {\n e.preventDefault();\n var label = this.href.split(':').pop();\n var action = \"Telephone Number Link\";\n var category = getPageName();\n track_event(category,action,label,false, \"\");\n handleLinks(this, e);\n });\n }\n }\n\n var trackFileDownloaded = function (e) {\n e.preventDefault();\n var label = this.href.split('/').pop();\n var action = \"Download\";\n var category = getPageName();\n track_event(category,action,label,false, \"\");\n handleLinks(this, e);\n };\n\n /*\n * The main function for tracking events\n *\n * Param data types currently under review\n *\n * @param {string} category\n * @param {string} action\n * @param {string} label\n * @param {bool} bounce\n * @param {string}? evalue\n * @returns {undefined}\n */\n var track_event = function (category, action, label, bounce, evalue) {\n if (typeof ga_element === \"undefined\") {\n if (typeof ga !== 'undefined') {\n ga_element = ga;\n } else if (typeof _gaq !== 'undefined') {\n ga_element = _gaq;\n } else if (typeof __gaTracker === \"function\") {\n ga_element = __gaTracker;\n } else if (typeof gaplusu === \"function\") {\n ga_element = gaplusu;\n } else if (gaeMapper.snippet_type !== 'gtm' && typeof dataLayer === \"undefined\") {\n return;\n }\n }\n\n var event_category = !category ? 'uncategorized' : category;\n category = event_category;\n\n var event_action = !action ? '' : action;\n action = event_action;\n\n var event_label = !label ? '' : label;\n label = event_label;\n\n var event_value = !evalue ? '' : evalue;\n var event_bounce = !bounce ? false : bounce;\n switch (gaeMapper.forceSnippet) {\n case \"none\":\n if (useGlobalSiteTagSnippet()) {\n globalSiteTagEvent(category, action, label, event_value, event_bounce);\n } else if (useGoogleTagManagerSnippet()) {\n googleTagManagerEvent(category, action, label, event_value, event_bounce);\n } else if (useUniversalTrackingSnippet()) {\n universalTrackingEvent(category, action, label, event_value, event_bounce);\n } else if (useLegacySnippet()) {\n legacyTrackingEvent(category, action, label, event_value, event_bounce);\n }\n break;\n case \"gtm\":\n googleTagManagerEvent(category, action, label, event_value, event_bounce);\n break;\n case \"gst\":\n globalSiteTagEvent(category, action, label, event_value, event_bounce);\n break;\n case \"universal\":\n universalTrackingEvent(category, action, label, event_value, event_bounce);\n break;\n }\n }; // End of track_event function\n\n var useGoogleTagManagerSnippet = function () {\n return (\n gaeMapper.snippet_type === \"gtm\" ||\n (typeof dataLayer !== \"undefined\" && typeof gtag === \"undefined\")\n );\n };\n\n var useGlobalSiteTagSnippet = function () {\n return gaeMapper.snippet_type === \"gst\" || typeof gtag !== \"undefined\";\n };\n\n var useUniversalTrackingSnippet = function () {\n return (\n gaeMapper.snippet_type === \"universal\" ||\n typeof ga !== \"undefined\" ||\n typeof __gaTracker === \"function\"\n );\n };\n\n var useLegacySnippet = function () {\n return gaeMapper.snippet_type === \"legacy\" || typeof _gaq !== \"undefined\";\n };\n\n // Use the Google Tag Manager object to send an event\n var googleTagManagerEvent = function (\n category,\n action,\n label,\n value,\n bounce\n ) {\n dataLayer.push({\n event: \"WPGAE\",\n eventCategory: category,\n eventAction: action,\n eventLabel: label,\n eventValue: value,\n nonInteraction: bounce,\n });\n };\n\n var globalSiteTagEvent = function (category, action, label, value, bounce) {\n gtag(\"event\", action, {\n // Event parameters\n event_category: category,\n event_label: label,\n value: value,\n non_interaction: bounce,\n });\n };\n\n var universalTrackingEvent = function (\n category,\n action,\n label,\n value,\n bounce\n ) {\n if (value) {\n ga_element(\"send\", \"event\", category, action, label, value, {\n nonInteraction: bounce,\n });\n } else {\n ga_element(\"send\", \"event\", category, action, label, {\n nonInteraction: bounce,\n });\n }\n };\n\n var legacyTrackingEvent = function (category, action, label, value, bounce) {\n ga_element.push([\"_trackEvent\", category, action, label, value, bounce]);\n };\n\n\n /**\n * Click event function\n *\n * @param {event} event\n * @returns {undefined}\n */\n var click_event = function (event) {\n\n track_event(event.data.category, event.data.action, event.data.label, event.data.bounce, event.data.evalue, this);\n if (typeof event.data.link_click_delay !== 'undefined' && event.data.link_click_delay > 0 && typeof event.target.href !== 'undefined' && event.target.nodeName == \"A\") {\n handleLinks(this, event);\n }\n }; // End of click event function\n\n\n var isNewTab = function (self) {\n var target = $(self).attr(\"target\")\n if (typeof target !== \"undefined\" && target.trim() === \"_blank\") {\n return true;\n }\n return false;\n }\n\n var handleLinks = function (self, event) {\n event.preventDefault();\n var link = getUrl(event);\n\n\n var w;\n var openInNewTab = isNewTab(self)\n if (openInNewTab) {\n w = window.open('', '_blank');\n }\n\n var hash = isJustHashLink(link);\n if (typeof hash !== \"undefined\" && hash !== \"\") {\n window.location.hash = hash;\n } else if (window.location.href !== link){\n setTimeout(function () {\n if (openInNewTab) {\n w.location.href = link;\n } else {\n window.location = link;\n }\n }, parseInt(gaeMapper.link_clicks_delay), w);\n }\n }\n\n var getUrl = function ( event ) {\n var url = \"\";\n if ( event.target.tagName !== \"A\" ) {\n url = $( event.target ).parents( \"a\" ).attr( \"href\" );\n } else {\n url = event.target.href;\n }\n return url;\n };\n\n var isJustHashLink = function ( url ) {\n if ( typeof url !== \"undefined\" && url.indexOf( \"#\" ) === 0 ) {\n return url;\n }\n return \"\";\n };\n\n function getPageName () {\n if (\"1\" === gaeMapper.isFrontPage) {\n return \"Home\";\n } else {\n if (typeof gaeMapper.pageTitle !== \"undefined\") {\n return gaeMapper.pageTitle;\n }\n }\n return \"\";\n }\n\n})(jQuery);\n"]}