{"version":3,"file":"analytics_ia.min.js","sources":["Scripts/commun/lib/analytics_ia.js"],"sourcesContent":["/**\r\n * DOCUMENTATION: https://dev.azure.com/iadx/iA%20Digital%20Experience/_wiki/wikis/iA-Digital-Experience.wiki/89/Utilisation-du-Data-Layer-front-end\r\n */\n\n__cw__define(['jquery'], function ($) {\n // eslint-disable-next-line\n window.dataLayer = window.dataLayer || [];\n var _autoTrackStartDate = null;\n var _environnement;\n var _pageId;\n\n /*********************************** INIT AND SHARED METHODS *******************************************/\n\n var initAutoTracking = function initAutoTracking(environnement, formType, pageId) {\n try {\n _environnement = environnement;\n _pageId = pageId.replace('{', '').replace('}', '');\n initFormTracking(formType);\n _autoTrackStartDate = Date.now();\n } catch (ex) {\n consoleError(\"An unhandled exception occured during Data Layer initialization: \" + ex.toString());\n }\n };\n function enableLogging() {\n return _environnement != 'prod';\n }\n function consoleInfo(message) {\n if (enableLogging()) {\n console.info(message);\n }\n }\n function consoleWarn(message) {\n if (enableLogging()) {\n console.warn(message);\n }\n }\n function consoleError(message) {\n if (enableLogging()) {\n console.error(message);\n }\n }\n function debounce(func, timeout) {\n var _this = this;\n if (timeout === void 0) {\n timeout = 300;\n }\n var timer;\n return function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n clearTimeout(timer);\n timer = setTimeout(function () {\n func.apply(_this, args);\n }, timeout);\n };\n }\n\n /******************************** Form Tracking ***************************************/\n\n var MOUSE_FLOW_FORM_NAME_PREFIX = 'mf_feedback';\n var FORM_COMPLETE_DELAY_MS = 500;\n var _trackedForms = {};\n var getHubSpotFormGuid = function getHubSpotFormGuid(form) {\n var hubSpotProperties = getHubSpotProperties(form);\n return hubSpotProperties ? hubSpotProperties['GA_HSFormGUID'] : null;\n };\n var getHubSpotUserGuid = function getHubSpotUserGuid(form) {\n var hubSpotProperties = getHubSpotProperties(form);\n return hubSpotProperties ? hubSpotProperties['GA_HSUserGUID'] : null;\n };\n function initFormTracking(formType) {\n initSearchFormTracking();\n $('form').each(function () {\n if ($(this).attr('data-utag-ignore') == 'true') {\n return;\n }\n trackForm(this, formType);\n });\n var debouncedRescan = debounce(function () {\n observer.disconnect();\n initFormTracking(formType);\n }, 1000);\n var observer = new MutationObserver(debouncedRescan);\n var config = {\n childList: true,\n subtree: true\n };\n var targetNode = document.body;\n observer.observe(targetNode, config);\n }\n function initFormControlTracking(formControlElement) {\n var formName = getFormNameFromControlElement(formControlElement);\n var formControlName = getFormControlName(formControlElement);\n var formControlInstanceId = getFormControlInstanceId(formControlElement);\n var isTracked = _trackedForms[formName].formControls[formControlName] && _trackedForms[formName].formControls[formControlName].instances[formControlInstanceId] && _trackedForms[formName].formControls[formControlName].instances[formControlInstanceId].isTracked;\n if (!formName || !formControlName || !formControlInstanceId) {\n return;\n }\n if ($(formControlElement).attr('type') == 'hidden' && !isTracked) {\n enableHiddenInputChangeTracking(formControlElement);\n } else if ($(formControlElement).hasClass('selectric')) {\n $(formControlElement).off('selectric-change', trackFormControlInteraction).on('selectric-change', trackFormControlInteraction);\n }\n $(formControlElement).off('change', trackFormControlInteraction).on('change', trackFormControlInteraction);\n if (_trackedForms[formName].formControls[formControlName] == undefined) {\n _trackedForms[formName].formControls[formControlName] = {\n instances: {}\n };\n }\n _trackedForms[formName].formControls[formControlName].instances[formControlInstanceId] = {\n isTracked: true\n };\n }\n function initSearchFormTracking() {\n if (_autoTrackStartDate != null) {\n return;\n }\n $('.header-form-recherche .bouton-recherche, .CoveoSearchButton').on('click', function () {\n trackFormComplete($(this).closest('form'));\n });\n }\n function trackForm(form, formType) {\n var formName = getFormName(form);\n if (formName == null) {\n return;\n } else if (formName.startsWith(MOUSE_FLOW_FORM_NAME_PREFIX)) {\n return;\n }\n if (!(_trackedForms[formName] && _trackedForms[formName].tracked)) {\n if (getFormType(form) == 'unknown') {\n if (formType != null && formType != '') {\n $(form).attr('data-utag-form-type', formType);\n } else {\n consoleWarn(\"No form type provided for form \\\"\" + formName + \"\\\". Please define the \\\"data-utag-form-type\\\" attribute on the form or set the tag in Sitecore for page \\\"\" + _pageId + \"\\\".\");\n }\n }\n if ($(form).attr('data-utag-ensure-visible') == 'true' && !$(form).is(':visible')) {\n return;\n }\n _trackedForms[formName] = {\n tracked: true,\n formControls: {}\n };\n if ($(form).attr('data-utag-ignore-form-view') != 'true') {\n trackFormInteraction(getFormName(form), getFormType(form), {\n 'form_guid': getHubSpotFormGuid(form),\n 'form_user_guid': getHubSpotUserGuid(form),\n 'form_value': getFormValue(form, 'form_view')\n }, null, 'form_view');\n }\n }\n $(form).find('select, input[type=text], input[type=number], input[type=range], input[type=checkbox], input[type=radio], input[type=tel], input[type=email], input[type=search], input[type=password], input[type=hidden][data-utag-force-track=true], textarea').each(function () {\n initFormControlTracking(this);\n });\n }\n function trackFormBegin(formControlElement) {\n var $form = $(formControlElement).closest('form');\n if ($form == null) {\n return false;\n }\n var formName = getFormName($form);\n if (_autoTrackStartDate && Date.now() - _autoTrackStartDate < 1000) {\n return false;\n } else if (_trackedForms[formName].trackFormBegin) {\n return true;\n }\n trackFormInteraction(formName, getFormType($form), {\n 'form_guid': getHubSpotFormGuid($form),\n 'form_user_guid': getHubSpotUserGuid($form),\n 'form_value': getFormValue($form, 'form_begin')\n }, null, 'form_begin');\n _trackedForms[formName].trackFormBegin = true;\n return true;\n }\n function trackFormComplete(form, callback, options) {\n try {\n var formName = getFormName(form);\n if (_trackedForms[formName] == null) {\n consoleWarn(\"trackFormComplete() called on untracked form '\" + formName + \"'.\");\n if (callback) callback();\n return;\n } else if (_trackedForms[formName].formCompleteTracked) {\n if (callback) callback();\n return;\n }\n _trackedForms[formName].formCompleteTracked = true;\n trackHubSpotProperties(form);\n if ($(form).attr('data-utag-form-complete-delay') == 'true') {\n window.setTimeout(function () {\n trackFormCompleteImmediately(form, callback, options);\n }, FORM_COMPLETE_DELAY_MS);\n } else {\n trackFormCompleteImmediately(form, callback, options);\n }\n } catch (ex) {\n consoleError(\"An unhandled exception occured during form complete tracking: \" + ex.toString());\n }\n }\n function trackFormCompleteImmediately(form, callback, options) {\n options = options != null ? options : {};\n trackFormInteraction(getFormName(form), getFormType(form), {\n 'form_guid': options.form_guid != null ? options.form_guid : getHubSpotFormGuid(form),\n 'form_user_guid': options.form_user_guid != null ? options.form_user_guid : getHubSpotUserGuid(form),\n 'form_value': options.form_value != null ? options.form_value : getFormValue(form, 'form_complete'),\n 'form_metric': options.form_metric != null ? options.form_metric : getFormMetric(form)\n }, null, 'form_complete');\n if (callback) {\n callback();\n }\n }\n function trackHubSpotProperties(form) {\n var hubSpotProperties = getHubSpotProperties(form);\n if (hubSpotProperties != null) {\n window.dataLayer.push(hubSpotProperties);\n consoleInfo(\"HubSpot properties tracked: \" + JSON.stringify(hubSpotProperties));\n }\n }\n function trackFormError(form) {\n return;\n }\n function trackFormInteraction(formName, formType, options, _callBack, eventName) {\n var interaction = {\n 'form_type': formType,\n 'form_name': formName,\n 'form_value': null,\n 'form_metric': null,\n 'form_step': null,\n 'form_guid': null\n };\n if (options && options.form_value != undefined) interaction['form_value'] = options.form_value;\n if (options && options.form_metric != undefined) interaction['form_metric'] = options.form_metric;\n if (options && options.form_step != undefined) interaction['form_step'] = options.form_step;\n if (options && options.form_guid != undefined) interaction['form_guid'] = options.form_guid;\n if (options && options.form_user_guid != undefined) interaction['form_user_guid'] = options.form_user_guid;\n window.dataLayer.push({\n 'event': eventName,\n 'interaction': interaction\n });\n if (_callBack) {\n _callBack();\n }\n consoleInfo(\"Form interaction tracked. Event Name: \" + eventName + \", Interaction: \" + JSON.stringify(interaction) + \".\");\n }\n function trackFormStep(formControlElement) {\n var $form = $(formControlElement).closest('form');\n if ($form == null) {\n return false;\n }\n var formName = getFormName($form);\n var formControlName = getFormControlName(formControlElement);\n if (_trackedForms[formName].formControls[formControlName].isStepTracked) {\n return;\n }\n trackFormInteraction(getFormName($form), getFormType($form), {\n 'form_step': formControlName,\n 'form_guid': getHubSpotFormGuid($form),\n 'form_user_guid': getHubSpotUserGuid($form),\n 'form_value': getFormValue($form, 'interaction')\n }, null, 'interaction');\n _trackedForms[formName].formControls[formControlName].isStepTracked = true;\n }\n function trackFormControlInteraction() {\n if (!$(this).val()) {\n return;\n }\n if (!trackFormBegin(this)) {\n return;\n }\n trackFormStep(this);\n }\n function enableHiddenInputChangeTracking(element) {\n var observer = new MutationObserver(function (mutations, observer) {\n if (mutations[0].attributeName == 'value') {\n $(element).trigger('change');\n }\n });\n observer.observe(element, {\n attributes: true\n });\n }\n function getHubSpotProperties(form) {\n var dataLayer = $(form).find('input[name=JSonDataLayerValue]').val();\n if (dataLayer == null || dataLayer == '') {\n dataLayer = $(\"input[data-utag-target-form-name=\" + getFormName(form) + \"]\").val();\n }\n if (dataLayer == null || dataLayer == '') {\n return null;\n }\n return JSON.parse(dataLayer);\n }\n function getFormName(formElement) {\n var formName = $(formElement).attr(\"data-utag-fname-\" + _pageId);\n if (formName == null || formName == '') {\n formName = $(formElement).attr('data-utag-fname');\n }\n if (formName == null || formName == '') {\n formName = $(formElement).attr('name');\n }\n if (formName == null || formName == '') {\n formName = $(formElement).attr('id');\n }\n if (formName == null) {\n return null;\n }\n return formName;\n }\n function getFormNameFromControlElement(formControlElement) {\n var formElement = $(formControlElement).closest('form');\n if (formElement == null) {\n return;\n }\n return getFormName(formElement);\n }\n function getFormType(formElement) {\n var formType = $(formElement).attr('data-utag-form-type');\n if (formType == null) {\n formType = 'unknown';\n }\n return formType;\n }\n function getFormControlName(formControlElement) {\n var formControlName = $(formControlElement).attr('data-utag-form-control-name');\n if (formControlName == null) {\n formControlName = $(formControlElement).attr('name');\n }\n if (formControlName == null) {\n formControlName = $(formControlElement).attr('id');\n }\n if (formControlName == null) {\n consoleWarn('Cannot retrieve name of form control element. Form control must have the \"data-utag-form-control-name\", \"name\" or \"id\" attribute set.');\n return false;\n }\n return formControlName;\n }\n function getFormControlInstanceId(formControlElement) {\n var formControlInstanceId = $(formControlElement).attr('id');\n if (formControlInstanceId == null) {\n formControlInstanceId = getFormControlName(formControlElement);\n }\n return formControlInstanceId;\n }\n function getFormValue(form, eventName) {\n var values = {};\n $(form).find('[data-utag-enable-value-tracking=true]').each(function () {\n if (eventName != 'form_complete' && $(this).attr('data-utag-enable-value-tracking-on-all-events') != 'true') {\n return;\n }\n values[getFormControlName(this)] = getFormControlElementValue(this);\n });\n var validEntries = Object.entries(values).filter(function (entry) {\n return entry[1] != undefined && entry[1] != '';\n });\n if (validEntries.length == 0) {\n return null;\n } else {\n return validEntries.map(function (entry) {\n return entry[0] + \"=\" + entry[1];\n }).join(';');\n }\n }\n function getFormMetric(form) {\n var metric = null;\n $(form).find('[data-utag-form-metric-value=true]').each(function () {\n metric = Number(getFormControlElementValue(this));\n });\n return !isNaN(metric) ? metric : null;\n }\n function getFormControlElementValue(formControlElement) {\n var value = null;\n var source = $(formControlElement).attr('data-utag-enable-value-tracking-source');\n if (source == 'label') {\n value = $(formControlElement).next('label').text().trim().replace('\\n', '');\n } else if (formControlElement.tagName.toLowerCase() == 'select') {\n value = $(formControlElement).find('option:selected').text();\n } else if (formControlElement.getAttribute('type') == 'checkbox') {\n value = $(formControlElement).is(':checked');\n } else if (formControlElement.getAttribute('type') == 'radio') {\n value = $('input[name=\"' + $(formControlElement).attr('name') + '\"]:checked').val();\n } else if (formControlElement.getAttribute('type') == 'file') {\n value = $(formControlElement)[0].files.length > 0;\n } else {\n value = $(formControlElement).val();\n }\n if (value != null && typeof value === 'string') {\n value = value.replace(/\\s+/g, ' ').trim();\n }\n return value;\n }\n\n /**************************************** Click Tracking ********************************************/\n\n var CLICK_LOCATION_MAPPING = {\n 'header': ['header', '.nav-secondaire'],\n 'footer': ['footer'],\n 'pop-up': ['.remodal-wrapper'],\n 'overlay': ['.zone-sticky'],\n 'dropdown': ['.dropdown-menu', '.dropdown-primary'],\n 'carrousel': ['.swiper-slide'] //TODO: mapper la position de carrousel\n };\n var NO_LINK_CLICK_TYPE = {\n 'tab': ['.tuile-action', '.commun-element-onglet'],\n 'dropdown': ['.titre-accordeon', '.dropdown-toggle', '.dropdown-group', '.selectric-wrapper', '.dropdown-primary'],\n 'checkbox': ['.icon-star', '#toggle_favorites']\n };\n function initClickTracking() {\n document.addEventListener('click', function (event) {\n var clickElement = event.target;\n var type = getNoLinkType(clickElement);\n if (type) {\n trackClickInteraction(type, getClickName(clickElement), null, getClickLocation(clickElement), null);\n return;\n }\n var linkElement = clickElement.closest('a');\n type = getLinkType(linkElement);\n if (type) {\n trackClickInteraction(type, getClickName(linkElement), linkElement.getAttribute('href'), getClickLocation(clickElement), null);\n }\n });\n document.addEventListener('change', function (event) {\n var inputElement = event.target;\n if (inputElement.getAttribute('type') == 'checkbox') {\n trackClickInteraction('checkbox', getClickName(inputElement.parentElement), null, getClickLocation(inputElement), null);\n }\n });\n }\n function trackClickInteraction(type, name, destination, location, value, _callBack) {\n var clickData = {\n 'click_type': type,\n 'click_name': name,\n 'click_destination': destination,\n 'click_location': location\n };\n if (value) clickData['click_value'] = value;\n window.dataLayer.push({\n 'event': 'click_interaction',\n 'interaction': clickData\n });\n if (_callBack) {\n _callBack();\n }\n }\n function getNoLinkType(clickElement) {\n var type;\n for (var clickType in NO_LINK_CLICK_TYPE) {\n NO_LINK_CLICK_TYPE[clickType].map(function (mapping) {\n if (clickElement.closest(mapping)) {\n type = clickType;\n consoleInfo('mapping click type to ' + clickType);\n }\n });\n }\n return type;\n }\n function getLinkType(linkElement) {\n if (linkElement) {\n var lien = linkElement.getAttribute('href');\n if (lien.startsWith('mailto:')) {\n return 'mail';\n } else if (lien.startsWith('tel:')) {\n return 'phone_number';\n } else {\n return 'link';\n }\n }\n return;\n }\n function getClickLocation(clickElement) {\n var location = 'body';\n for (var locationMap in CLICK_LOCATION_MAPPING) {\n CLICK_LOCATION_MAPPING[locationMap].map(function (mapping) {\n if (clickElement.closest(mapping)) {\n location = locationMap;\n consoleInfo('mapping click location to ' + locationMap);\n }\n });\n }\n return location;\n }\n\n // TODO: Ameliorer pour obtenir le text au lieu des icones ou \"vide\" dependamment d'ou on clique dans l'element\n function getClickName(clickElement) {\n var name = clickElement.innerText;\n if (!name) consoleInfo('No text mapped where the element was clicked.');\n return name;\n }\n\n /************************************************** Video Tracking *****************************************************************/\n\n var VIDEO_PROGRESS_TRACK_THRESHOLDS = [25, 50, 75];\n var _trackedVideos = {};\n function initVideoTracking() {\n window.onYouTubeIframeAPIReady = function () {\n $('iframe').each(function () {\n var videoId = this.id;\n if (videoId == null || _trackedVideos[videoId] && !_trackedVideos[videoId].tracked) {\n return;\n }\n // eslint-disable-next-line\n var player = YT.get(videoId);\n if (player == null) {\n // eslint-disable-next-line\n player = new YT.Player(this);\n }\n _trackedVideos[videoId] = {\n player: player,\n progressTresholds: {},\n title: this.title,\n src: this.src\n };\n player.addEventListener('onStateChange', function (event) {\n trackVideoStateChange(videoId, event.data);\n });\n window.setInterval(function () {\n trackVideoProgress(videoId);\n }, 1000);\n _trackedVideos[videoId].tracked = true;\n });\n };\n }\n function trackVideoInteraction(title, duration, progress, link, _callBack, eventName) {\n if (eventName === void 0) {\n eventName = 'video_start';\n }\n var interaction = {\n 'video_title': title,\n 'video_duration': duration,\n 'video_link': link\n };\n if (progress) interaction['video_progress'] = progress;\n window.dataLayer.push({\n 'event': eventName,\n 'interaction': interaction\n });\n if (_callBack) {\n _callBack();\n }\n consoleInfo(\"Video interaction tracked. Event Name: \" + eventName + \", Interaction: \" + JSON.stringify(interaction) + \".\");\n }\n function trackVideoStateChange(videoId, state) {\n var player = _trackedVideos[videoId].player;\n if (state == 1 && !_trackedVideos[videoId].trackVideoStart) {\n trackVideoInteraction(player.getVideoData().title, player.getDuration(), null, _trackedVideos[videoId].src, null, 'video_start');\n _trackedVideos[videoId].trackVideoStart = true;\n } else if (state == 0 && !_trackedVideos[videoId].trackVideoCompleted) {\n trackVideoInteraction(player.getVideoData().title, player.getDuration(), 100, _trackedVideos[videoId].src, null, 'video_complete');\n _trackedVideos[videoId].trackVideoCompleted = true;\n }\n }\n function trackVideoProgress(videoId) {\n var player = _trackedVideos[videoId].player;\n var progressPercentage = player.getCurrentTime() / player.getDuration() * 100;\n var newProgressTresholdsReached = VIDEO_PROGRESS_TRACK_THRESHOLDS.filter(function (threshold) {\n return progressPercentage >= threshold && !_trackedVideos[videoId].progressTresholds[threshold];\n });\n newProgressTresholdsReached.forEach(function (threshold) {\n trackVideoInteraction(player.getVideoData().title, player.getDuration(), threshold, _trackedVideos[videoId].src, null, 'video_progress');\n _trackedVideos[videoId].progressTresholds[threshold] = true;\n });\n }\n\n /************************************************** Misc Tracking *****************************************************************/\n\n function initScrollDepthTracking() {\n if (_autoTrackStartDate != null) {\n return;\n }\n var hauteurMax = document.documentElement.scrollHeight - document.documentElement.clientHeight;\n var tracking = [{\n pourcentage: '50',\n envoye: false\n }, {\n pourcentage: '90',\n envoye: false\n }];\n document.addEventListener('scroll', function (event) {\n var positionActuel = window.scrollY;\n var pourcentage = Math.round(positionActuel / hauteurMax * 100);\n tracking.map(function (track) {\n if (pourcentage > track.pourcentage && !track.envoye) {\n window.dataLayer.push({\n 'event': 'depth_reached',\n 'interaction': {\n 'scroll_depth': track.pourcentage\n }\n });\n track.envoye = true;\n }\n });\n });\n }\n return {\n getHubSpotUserGuid: getHubSpotUserGuid,\n getHubSpotFormGuid: getHubSpotFormGuid,\n initAutoTracking: initAutoTracking,\n trackFormBegin: trackFormBegin,\n trackFormComplete: trackFormComplete,\n trackFormError: trackFormError,\n trackClickInteraction: trackClickInteraction,\n trackFormInteraction: trackFormInteraction\n };\n});"],"names":["__cw__define","$","window","dataLayer","_environnement","_pageId","_autoTrackStartDate","enableLogging","consoleInfo","message","console","info","consoleWarn","warn","consoleError","error","debounce","func","timeout","timer","_this","this","_len","arguments","length","args","Array","_key","clearTimeout","setTimeout","apply","MOUSE_FLOW_FORM_NAME_PREFIX","FORM_COMPLETE_DELAY_MS","_trackedForms","getHubSpotFormGuid","form","hubSpotProperties","getHubSpotProperties","getHubSpotUserGuid","initFormControlTracking","formControlElement","element","formName","formElement","closest","getFormName","formControlName","getFormControlName","formControlInstanceId","attr","isTracked","formControls","instances","hasClass","off","trackFormControlInteraction","on","MutationObserver","mutations","observer","attributeName","trigger","observe","attributes","undefined","initSearchFormTracking","trackFormComplete","trackForm","formType","startsWith","tracked","getFormType","is","trackFormInteraction","form_guid","form_user_guid","form_value","getFormValue","find","each","trackFormBegin","$form","Date","now","callback","options","formCompleteTracked","push","JSON","stringify","trackFormCompleteImmediately","ex","toString","metric","form_metric","Number","getFormControlElementValue","isNaN","_callBack","eventName","interaction","form_type","form_name","form_step","event","val","isStepTracked","parse","values","validEntries","Object","entries","filter","entry","map","join","value","next","text","trim","replace","tagName","toLowerCase","getAttribute","files","trackClickInteraction","type","name","destination","location","clickData","click_type","click_name","click_destination","click_location","initAutoTracking","environnement","pageId","initFormTracking","debouncedRescan","disconnect","config","childList","subtree","targetNode","document","body","trackFormError"],"mappings":"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"}