{"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"]}