// source --> https://chistimvse.ru/wp-content/themes/chistim/js/cookie.js?ver=260615--1 
// ==============================================

(function() {
    'use strict';

    // ========== КОНФИГУРАЦИЯ ==========
    const CONFIG = {
        cookieName: 'utm_data',
        cookieDays: 7,
        version: '0.85',
        storageVersionKey: 'utm_data_script_version',
        cookiePath: '/',
        useLocalStorage: true,       // дублировать данные в localStorage
        firstTouch: false,            // не перезаписывать, если данные уже есть
        trackMetadata: true,         // сохранять referrer, landing_page, временные метки
        debug: window.location.search.includes('debug_utm=1')
    };

    // ========== СЛОВАРИ ==========

    // Поисковые системы (регулярное выражение для домена, имя источника)
    const SEARCH_ENGINES = [
        { pattern: /(^|\.)google\.([a-z]{2,3}|com?\.[a-z]{2})$/i, source: 'google' },
        { pattern: /(^|\.)yandex\.(ru|com|ua|by|kz|tr)$/i, source: 'yandex' },
        { pattern: /(^|\.)bing\.com$/i, source: 'bing' },
        { pattern: /(^|\.)yahoo\.com$/i, source: 'yahoo' },
        { pattern: /(^|\.)baidu\.com$/i, source: 'baidu' },
        { pattern: /(^|\.)duckduckgo\.com$/i, source: 'duckduckgo' },
        { pattern: /(^|\.)naver\.com$/i, source: 'naver' },
        { pattern: /(^|\.)seznam\.cz$/i, source: 'seznam' },
        { pattern: /(^|\.)sogou\.com$/i, source: 'sogou' },
        { pattern: /(^|\.)mail\.ru$/i, source: 'mail.ru' },
        { pattern: /(^|\.)rambler\.ru$/i, source: 'rambler' },
        { pattern: /(^|\.)qwant\.com$/i, source: 'qwant' },
        { pattern: /(^|\.)ecosia\.org$/i, source: 'ecosia' },
        { pattern: /(^|\.)ask\.com$/i, source: 'ask' },
        { pattern: /(^|\.)dzen\.ru$/i, source: 'dzen' }
    ];

    // Социальные сети (регулярное выражение для домена, имя, medium)
    const SOCIAL_NETWORKS = [
        // Социальные сети
        { pattern: /(^|\.)facebook\.com$/i, source: 'facebook', medium: 'social' },
        { pattern: /(^|\.)fb\.com$/i, source: 'facebook', medium: 'social' },
        { pattern: /(^|\.)instagram\.com$/i, source: 'instagram', medium: 'social' },
        { pattern: /(^|\.)twitter\.com$/i, source: 'twitter', medium: 'social' },
        { pattern: /(^|\.)x\.com$/i, source: 'twitter', medium: 'social' },
        { pattern: /(^|\.)linkedin\.com$/i, source: 'linkedin', medium: 'social' },
        { pattern: /(^|\.)vk\.com$/i, source: 'vkontakte', medium: 'social' },
        { pattern: /(^|\.)ok\.ru$/i, source: 'odnoklassniki', medium: 'social' },
        { pattern: /(^|\.)dzen\.ru$/i, source: 'dzen', medium: 'social' },
        
        // МЕССЕНДЖЕРЫ
        { pattern: /(^|\.)t\.me$/i, source: 'telegram', medium: 'messenger' },
        { pattern: /(^|\.)telegram\.org$/i, source: 'telegram', medium: 'messenger' },
        { pattern: /(^|\.)web\.telegram\.org$/i, source: 'telegram', medium: 'messenger' },
        { pattern: /wa\.me|whatsapp\.com/i, source: 'whatsapp', medium: 'messenger' },
        { pattern: /(^|\.)viber\.com$/i, source: 'viber', medium: 'messenger' },
        { pattern: /(^|\.)signal\.org$/i, source: 'signal', medium: 'messenger' },
        { pattern: /(^|\.)line\.me$/i, source: 'line', medium: 'messenger' },
        { pattern: /(^|\.)kakao(talk)?\.com$/i, source: 'kakaotalk', medium: 'messenger' },
        { pattern: /(^|\.)imax\.im$/i, source: 'imax', medium: 'messenger' },
        { pattern: /(^|\.)discord\.com$/i, source: 'discord', medium: 'messenger' },
        { pattern: /(^|\.)weixin\.qq\.com$/i, source: 'wechat', medium: 'messenger' },
        
        // Остальные соцсети
        { pattern: /(^|\.)snapchat\.com$/i, source: 'snapchat', medium: 'social' },
        { pattern: /(^|\.)pinterest\.[a-z]+$/i, source: 'pinterest', medium: 'social' },
        { pattern: /(^|\.)tumblr\.com$/i, source: 'tumblr', medium: 'social' },
        { pattern: /(^|\.)reddit\.com$/i, source: 'reddit', medium: 'social' },
        { pattern: /(^|\.)tiktok\.com$/i, source: 'tiktok', medium: 'social' },
        { pattern: /(^|\.)qq\.com$/i, source: 'qq', medium: 'social' },
        { pattern: /(^|\.)pikabu\.ru$/i, source: 'pikabu', medium: 'social' },
        { pattern: /(^|\.)habr\.com$/i, source: 'habr', medium: 'social' }
    ];

    // Рекламные параметры (gclid, yclid и т.д.)
    const AD_PARAMS = [
        { param: 'gclid',   source: 'google',   medium: 'cpc' },
        { param: 'yclid',   source: 'yandex',   medium: 'cpc' },
        { param: 'fbclid',  source: 'facebook', medium: 'cpc' },
        { param: 'ymclid',  source: 'yandex',   medium: 'cpc' },
        { param: 'openstat',source: 'openstat', medium: 'cpc' },
        { param: 'msclkid', source: 'bing',     medium: 'cpc' },
        { param: 'twclid',  source: 'twitter',  medium: 'cpc' },
        { param: 'li_fat_id', source: 'linkedin', medium: 'cpc' },
        { param: 'mc_cid',  source: 'mailchimp', medium: 'email' }
    ];

    const EXTRA_PARAMS = [
        'ya_client_id'
    ];

    // Маппинг параметров поискового запроса для разных поисковиков
    const SEARCH_QUERY_PARAMS = {
        google: ['q', 'query'],
        yandex: ['text', 'q'],
        bing: ['q'],
        yahoo: ['p', 'q'],
        baidu: ['wd', 'word'],
        duckduckgo: ['q'],
        naver: ['query'],
        seznam: ['q'],
        rambler: ['query'],
        mailru: ['q'],
        dzen: ['q', 'text']
    };

    // ========== ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ ==========

    function log(...args) {
        if (CONFIG.debug) {
            console.groupCollapsed('[UTM]', ...args);
            console.trace();
            console.groupEnd();
        }
    }

    // Установка cookie с проверкой размера
    function setCookie(name, value, days) {
        let cookie = name + '=' + encodeURIComponent(JSON.stringify(value)) + '; path=' + CONFIG.cookiePath + '; SameSite=Lax';
        if (days) {
            const expires = new Date(Date.now() + days * 24 * 60 * 60 * 1000).toUTCString();
            cookie += '; expires=' + expires;
        }
        if (window.location.protocol === 'https:') cookie += '; Secure';
        document.cookie = cookie;
    }

    function setSafeCookie(name, value, days) {
        const serialized = JSON.stringify(value);
        if (serialized.length > 4000) {
            const essential = {};
            ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content'].forEach(field => {
                if (value[field]) essential[field] = value[field];
            });
            AD_PARAMS.forEach(({ param }) => {
                if (value[param]) essential[param] = value[param];
            });
            setCookie(name, essential, days);
            log('Cookie size limit, saved only essential UTM/ad params');
        } else {
            setCookie(name, value, days);
        }
    }

    function getCookie(name) {
        const matches = document.cookie.match(new RegExp(
            '(?:^|; )' + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + '=([^;]*)'
        ));
        if (matches) {
            try {
                return JSON.parse(decodeURIComponent(matches[1]));
            } catch (e) {
                return null;
            }
        }
        return null;
    }

    // Хранилище с fallback на localStorage
    function setStorage(data) {
        try {
            data._version = CONFIG.version; 
            setSafeCookie(CONFIG.cookieName, data, CONFIG.cookieDays);
            if (CONFIG.useLocalStorage) {
                localStorage.setItem(CONFIG.cookieName, JSON.stringify(data));
            }
        } catch (e) {
            log('Storage error', e);
        }
    }

    function getStorage() {
        let data = getCookie(CONFIG.cookieName);
        if (!data && CONFIG.useLocalStorage) {
            try {
                const ls = localStorage.getItem(CONFIG.cookieName);
                if (ls) data = JSON.parse(ls);
            } catch (e) {}
        }
        return data;
    }

    // Получение всех параметров из URL
    function getUrlParams() {
        return new URLSearchParams(window.location.search);
    }

    // Сбор всех UTM-меток из URL
    function getUtmFromUrl(params) {
        const utmFields = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content'];
        const result = {};
        let hasUtm = false;
        utmFields.forEach(field => {
            const value = params.get(field);
            if (value) {
                result[field] = value;
                hasUtm = true;
            }
        });
        return hasUtm ? result : null;
    }

    // Сбор рекламных параметров из URL
    function getAdParamsFromUrl(params) {
        const result = {};
        AD_PARAMS.forEach(({ param, source, medium }) => {
            const value = params.get(param);
            if (value) {
                result[param] = value;
                if (!result.utm_source) result.utm_source = source;
                if (!result.utm_medium) result.utm_medium = medium;
            }
        });
        return Object.keys(result).length ? result : null;
    }

    // Функция для извлечения дополнительных параметров из URL
    function getExtraParamsFromUrl(params) {
        const result = {};
        EXTRA_PARAMS.forEach(param => {
            const value = params.get(param);
            if (value) result[param] = value;
        });
        return Object.keys(result).length ? result : null;
    }

    // Функция для чтения ya_client_id из cookie Яндекс.Метрики (_ym_uid)
    function getYaClientIdFromCookie() {
        const match = document.cookie.match(/(?:^|;\s*)_ym_uid=([^;]+)/);
        return match ? match[1] : '';
    }


    function detectDesktopApps() {
        const ua = navigator.userAgent.toLowerCase();
        
        // Маппинг: User-Agent паттерн → source/medium (связь с SOCIAL_NETWORKS)
            const desktopMappings = {
                'telegram|tdesktop|telegramdesktop': { source: 'telegram', medium: 'messenger' },
                'bitrix24|bxdesktop': { source: 'bitrix24', medium: 'messenger' },
                'whatsapp': { source: 'whatsapp', medium: 'messenger' },
                'viber': { source: 'viber', medium: 'messenger' },
                'signal': { source: 'signal', medium: 'messenger' },
                'discord': { source: 'discord', medium: 'messenger' },
                'line': { source: 'line', medium: 'messenger' },
                'imax|max': { source: 'imax', medium: 'messenger' },
                
                // Другие коммуникааторы (не мессенджеры)
                'slack': { source: 'slack', medium: 'chat' },
                'teams': { source: 'teams', medium: 'chat' },
                'zoom': { source: 'zoom', medium: 'video' },
                'skype': { source: 'skype', medium: 'chat' }
            };
            
            for (const [pattern, mapping] of Object.entries(desktopMappings)) {
                if (new RegExp(pattern).test(ua)) {
                    const data = {
                        utm_source: mapping.source,
                        utm_medium: mapping.medium,
                        utm_campaign: '(none)',
                        utm_term: '(none)',
                        utm_content: '(none)'
                    };
                    log('Desktop app detected:', mapping.source, mapping.medium, 'UA:', ua.slice(0, 100));
                    return data;
                }
            }
            
            return null;
        }


    // Определение источника по referrer
    function detectByReferrer() {
        const referrer = document.referrer;
        if (!referrer) {
             log('No referrer - need to check desktop apps later');
            return null;
        }

        let url;
        try {
            url = new URL(referrer);
        } catch (e) {
            log('Invalid referrer URL', referrer);
            return null;
        }

        const hostname = url.hostname.toLowerCase();
        const currentHost = window.location.hostname.toLowerCase();

        // Внутренний переход
        if (hostname === currentHost || hostname === `www.${currentHost}`) {
            log('Internal referrer, skip');
            return null;
        }

        // Поисковые системы
        for (let se of SEARCH_ENGINES) {
            if (se.pattern.test(hostname)) {
                let term = '(not provided)';
                const queryParams = SEARCH_QUERY_PARAMS[se.source] || ['q'];
                for (let param of queryParams) {
                    if (url.searchParams.has(param)) {
                        term = url.searchParams.get(param);
                        break;
                    }
                }
                log('Search engine:', se.source, 'term:', term);
                return {
                    utm_source: se.source,
                    utm_medium: 'organic',
                    utm_campaign: '(none)',
                    utm_term: term,
                    utm_content: '(none)'
                };
            }
        }

        // Социальные сети и мессенджеры
        for (let sn of SOCIAL_NETWORKS) {
            if (sn.pattern.test(hostname)) {
                log('Social/messenger:', sn.source);
                return {
                    utm_source: sn.source,
                    utm_medium: sn.medium || 'social',
                    utm_campaign: '(none)',
                    utm_term: '(none)',
                    utm_content: '(none)'
                };
            }
        }

        // Прочие сайты = рефералы
        const domain = hostname.replace(/^www\./, '');
        log('Referral traffic:', domain);
        return {
            utm_source: domain,
            utm_medium: 'referral',
            utm_campaign: '(none)',
            utm_term: '(none)',
            utm_content: '(none)'
        };
    }

    function clearUtmStorage() {
        setCookie(CONFIG.cookieName, null, -1);

        try {
            localStorage.removeItem(CONFIG.cookieName);
            localStorage.setItem(CONFIG.storageVersionKey, String(CONFIG.version));
        } catch (e) {}
    }

    function ensureActualStorageVersion() {
        let storedVersion = '';

        try {
            storedVersion = localStorage.getItem(CONFIG.storageVersionKey) || '';
        } catch (e) {}

        if (storedVersion !== String(CONFIG.version)) {
            clearUtmStorage();
        }
    }

    // ========== ДОПОЛНЕНИЕ ОТСУТСТВУЮЩИХ UTM-ПОЛЕЙ ==========
    function fillMissingUtm(data) {
        if (!data || typeof data !== 'object') return data;
        
        const defaults = {
            utm_campaign: '(none)',
            utm_term: '(none)',
            utm_content: '(none)'
        };
        
        Object.entries(defaults).forEach(([key, value]) => {
            if (!data.hasOwnProperty(key)) data[key] = value;
        });
        
        return data;
    }

    // Слияние объектов
    function mergeData(existing, newData) {
        return { ...existing, ...newData };
    }

    // Генерация метаданных
    function getMetadata(isFirstVisit) {
        const meta = {
            last_visit_time: Date.now()
        };
        if (isFirstVisit) {
            meta.referrer = document.referrer;
            meta.landing_page = window.location.href;
            meta.first_visit_time = Date.now();
        }
        return meta;
    }

    function enrichAndSaveData(data, storedData, isFirstVisit) {
        let result = {};

        if (storedData && typeof storedData === 'object') {
            result = mergeData(storedData, data);
        } else {
            result = mergeData({}, data);
        }

        fillMissingUtm(result);

        if (CONFIG.trackMetadata) {
            result.last_visit_time = Date.now();

            if (!result.landing_page) {
                result.landing_page = window.location.href;
            }

            if (!result.first_visit_time) {
                result.first_visit_time = Date.now();
            }

            if (!result.hasOwnProperty('referrer')) {
                result.referrer = document.referrer || '';
            }
        }

        const yaClientId = getYaClientIdFromCookie();
        if (yaClientId && !result.ya_client_id) {
            result.ya_client_id = yaClientId;
        }

        setStorage(result);
        return result;
    }

    // Очистка данных (для отладки)
    window.clearUtmData = function() {
        setCookie(CONFIG.cookieName, null, -1);
        if (CONFIG.useLocalStorage) localStorage.removeItem(CONFIG.cookieName);
        log('UTM data cleared');
    };
    

    // Главная функция обновления UTM-данных
    function updateUtmData() {
        const urlParams = getUrlParams();
        let newData = {};

        // 1. UTM из URL
        const utmFromUrl = getUtmFromUrl(urlParams);
        if (utmFromUrl) {
            newData = mergeData(newData, utmFromUrl);
            log('UTM found in URL:', utmFromUrl);
        }

        // 2. Рекламные параметры
        const adParams = getAdParamsFromUrl(urlParams);
        if (adParams) {
            newData = mergeData(newData, adParams);
            log('Ad params found in URL:', adParams);
        }

        
        let storedData = getStorage();

        if (storedData && String(storedData._version || '') !== String(CONFIG.version)) {
            log('Version mismatch, clearing old data');
            clearUtmStorage();
            storedData = null;
        }

        const hasAttributionData = Object.keys(newData).length > 0;

        // 2b. Дополнительные параметры из URL (например, ya_client_id)
        const extraParams = getExtraParamsFromUrl(urlParams);
        if (extraParams) {
            newData = mergeData(newData, extraParams);
            log('Extra params found in URL:', extraParams);
        }

        // 2c. Если ya_client_id ещё нет, пробуем взять из cookie Яндекс.Метрики
        if (!newData.ya_client_id) {
            const yaClientId = getYaClientIdFromCookie();
            if (yaClientId) {
                newData.ya_client_id = yaClientId;
                log('ya_client_id from cookie:', yaClientId);
            }
        }

        // 3. First-touch защита: если уже есть данные и включён firstTouch, не перезаписываем
        if (storedData && CONFIG.firstTouch && hasAttributionData) {
            log('First touch: existing data preserved', storedData);
            return;
        }

        // 4. Если есть новые данные — сохраняем (с метаданными, после дополнения полей)
        if (hasAttributionData) {
            if (CONFIG.trackMetadata) {
                const isFirst = !storedData;
                const meta = getMetadata(isFirst);
                newData = mergeData(newData, meta);
            }
            // Дополняем недостающие utm-поля значениями по умолчанию
            fillMissingUtm(newData);
            setStorage(newData);
            log('Saved new UTM data:', newData);
            return;
        }

        // 5. Нет новых данных, но есть сохранённые — используем их
        if (storedData && Object.keys(storedData).length > 0) {
            if (storedData.utm_source && storedData.utm_medium) {
                log('Using existing data:', storedData);
                watchYaClientId();
                return;
            }

            log('Stored data has no utm_source/utm_medium, ignoring:', storedData);
            storedData = null;
        }

        // 6a. Desktop-приложения
        const desktopApp = detectDesktopApps();
        if (desktopApp) {
            fillMissingUtm(desktopApp);
            if (CONFIG.trackMetadata) {
                const meta = getMetadata(true);
                Object.assign(desktopApp, meta);
            }
            setStorage(desktopApp);
            log('Detected desktop app:', desktopApp);
            watchYaClientId();
            return;
        }

        // 6b. Referrer
        else {
            const detected = detectByReferrer();
            if (detected) {
                fillMissingUtm(detected);
                if (CONFIG.trackMetadata) {
                    const meta = getMetadata(true);
                    Object.assign(detected, meta);
                }
                setStorage(detected);
                log('Detected by referrer:', detected);
                watchYaClientId();
                return;
            }
            else {
                const direct = {
                    utm_source: '(direct)',
                    utm_medium: '(none)',
                    utm_campaign: '(none)',
                    utm_content: '(none)',
                    utm_term: '(none)'
                };

                const savedDirect = enrichAndSaveData(direct, storedData, !storedData);

                log('Detected DIRECT', savedDirect);
                watchYaClientId();
                return;
            }
        }
    }

    // ========== ОБРАБОТКА SPA (изменение URL без перезагрузки) ==========
    let lastUrl = location.href;
    function onUrlChange() {
        if (location.href !== lastUrl) {
            lastUrl = location.href;
            updateUtmData();
        }
    }

    // Перехват pushState
    const originalPushState = history.pushState;
    history.pushState = function() {
        originalPushState.apply(this, arguments);
        onUrlChange();
    };
    window.addEventListener('popstate', onUrlChange);

    function watchYaClientId() {
        let attempts = 0;
        const maxAttempts = 10;        // максимум 5 секунд
        const interval = 500;          // проверяем каждые 500 мс

        const intervalId = setInterval(() => {
            attempts++;
            const yaClientId = getYaClientIdFromCookie();
            if (yaClientId) {
                // Получаем текущие данные из хранилища
                let currentData = getStorage();
                if (currentData && typeof currentData === 'object') {
                    // Если ya_client_id ещё не установлен или отличается, обновляем
                    if (currentData.ya_client_id !== yaClientId) {
                        currentData.ya_client_id = yaClientId;
                        setStorage(currentData);
                        log('ya_client_id added to utm_data:', yaClientId);
                    }
                }
                clearInterval(intervalId);
                return;
            }
            if (attempts >= maxAttempts) {
                log('ya_client_id not found after', maxAttempts * interval / 1000, 'seconds');
                clearInterval(intervalId);
            }
        }, interval);
    }

    // ========== ЗАПУСК ==========
    if (typeof window !== 'undefined') {
        if (document.readyState === 'loading') {
            document.addEventListener('DOMContentLoaded', function () {
                ensureActualStorageVersion();
                updateUtmData();
            });
        } else {
            ensureActualStorageVersion();
            updateUtmData();
        }
    }
})();




(function () {
  'use strict'

  var STORAGE_KEY = 'utm_data'
  var ANALYTICS_FIELDS = [
    'yclid',
    'ya_client_id',
    'referrer',
    'landing_page',
    'user_agent',
    'utm_source',
    'utm_medium',
    'utm_campaign',
    'utm_term',
    'utm_content',
    'gclid',
    'fbclid',
    'msclkid',
    'twclid',
    'li_fat_id',
    'mc_cid',
    'openstat',
    'ymclid'
  ]

  function parseJson(value) {
    if (!value || typeof value !== 'string') return {}

    try {
      var parsed = JSON.parse(value)
      return parsed && typeof parsed === 'object' ? parsed : {}
    } catch (e) {
      return {}
    }
  }

  function getCookieJson(name) {
    var escapedName = name.replace(/([.$?*|{}()\[\]\\/+^])/g, '\\$1')
    var matches = document.cookie.match(
      new RegExp('(?:^|; )' + escapedName + '=([^;]*)')
    )

    if (!matches) return {}

    try {
      return parseJson(decodeURIComponent(matches[1]))
    } catch (e) {
      return {}
    }
  }

  function getStoredUtmData() {
    var data = getCookieJson(STORAGE_KEY)

    try {
      var lsData = parseJson(localStorage.getItem(STORAGE_KEY))
      data = Object.assign({}, data, lsData)
    } catch (e) {}

    return data && typeof data === 'object' ? data : {}
  }

  function getField(form, name) {
    var field = form.elements[name]

    if (!field) return null
    if (
      typeof RadioNodeList !== 'undefined' &&
      field instanceof RadioNodeList
    ) {
      return field[0] || null
    }

    return field
  }

  function setHidden(form, name, value) {
    var field = getField(form, name)

    if (!field) {
      field = document.createElement('input')
      field.type = 'hidden'
      field.name = name
      field.className = name
      form.appendChild(field)
    }

    field.value = value == null ? '' : String(value)
  }

  function getHiddenValue(form, name) {
    var field = getField(form, name)
    return field ? String(field.value || '') : ''
  }

  function detectFormType(form) {
    return (
      getHiddenValue(form, 'form_type') ||
      form.getAttribute('data-form-type') ||
      form.id ||
      String(form.className || '')
        .split(/\s+/)
        .filter(Boolean)[0] ||
      'site_form'
    )
  }

  function buildAnalytics(form) {
    var stored = getStoredUtmData()
    var formName =
      getHiddenValue(form, 'form_name') ||
      form.getAttribute('data-form-name') ||
      ''
    var analytics = {}

    ANALYTICS_FIELDS.forEach(function (key) {
      analytics[key] = stored[key] == null ? '' : String(stored[key])
    })

    analytics.referrer = analytics.referrer || document.referrer || ''
    analytics.landing_page = analytics.landing_page || window.location.href
    analytics.user_agent = navigator.userAgent || ''
    analytics.form = formName
    analytics.form_type = detectFormType(form)

    if (!analytics.utm_source)
      analytics.utm_source = document.referrer ? '(referral)' : '(direct)'
    if (!analytics.utm_medium)
      analytics.utm_medium = document.referrer ? 'referral' : '(none)'
    if (!analytics.utm_campaign) analytics.utm_campaign = '(none)'
    if (!analytics.utm_term) analytics.utm_term = '(none)'
    if (!analytics.utm_content) analytics.utm_content = '(none)'

    return analytics
  }

  function fillAnalyticsFields(form) {
    if (!form || !form.matches || !form.matches('form')) return

    var analytics = buildAnalytics(form)
    var sourceParts = [
      analytics.utm_source,
      analytics.utm_medium,
      analytics.utm_campaign
    ].filter(function (value) {
      return value && value !== '(none)'
    })

    setHidden(form, 'analytics_data', JSON.stringify(analytics))
    setHidden(form, 'utm_data', JSON.stringify(analytics))
    setHidden(form, 'referrer_data', sourceParts.join(' / '))
    setHidden(form, 'currentPage', window.location.href)
    setHidden(form, 'userPlatform', navigator.platform || '')

    Object.keys(analytics).forEach(function (key) {
      setHidden(form, key, analytics[key])
    })
  }

  function fillAllForms() {
    document.querySelectorAll('form').forEach(fillAnalyticsFields)
  }

  document.addEventListener(
    'submit',
    function (event) {
      fillAnalyticsFields(event.target)
    },
    true
  )

  if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', fillAllForms)
  } else {
    fillAllForms()
  }

  window.DSAnalyticsForms = {
    fill: fillAnalyticsFields,
    fillAll: fillAllForms,
    getStoredUtmData: getStoredUtmData
  }
})();