BEFORE Google Tag Manager. */ (function () { 'use strict'; // ─── Configuration ─────────────────────────────────────────────────── var CONFIG = { cookieName: 'tms_cookie_consent', cookieExpiry: 365, consentVersion: 1, privacyPolicyUrl: '/privacy-policy/', cookiePolicyUrl: '/cookie-policy/', categories: { necessary: { name: 'Strictly Necessary', icon: '', description: 'Essential cookies required for the website to function properly. These cannot be disabled.', alwaysOn: true, cookies: [ { name: 'wordpress_*', provider: 'WordPress', purpose: 'Session management and authentication', expiry: 'Session' }, { name: 'wp-settings-*', provider: 'WordPress', purpose: 'User interface customization', expiry: '1 year' }, { name: 'tms_cookie_consent', provider: 'TM Services', purpose: 'Stores your cookie preferences', expiry: '1 year' } ] }, analytics: { name: 'Analytics', icon: '', description: 'Help us understand how visitors interact with our website by collecting and reporting information anonymously.', alwaysOn: false, cookies: [ { name: '_ga', provider: 'Google Analytics', purpose: 'Distinguishes unique users', expiry: '2 years' }, { name: '_ga_9XENJ4JP0D', provider: 'Google Analytics 4', purpose: 'Stores session state', expiry: '2 years' }, { name: '_gid', provider: 'Google Analytics', purpose: 'Distinguishes users (short-term)', expiry: '24 hours' }, { name: '_gat_UA-*', provider: 'Google Analytics', purpose: 'Throttles request rate', expiry: '1 minute' }, { name: '_clck', provider: 'Microsoft Clarity', purpose: 'Persists user ID for analytics', expiry: '1 year' }, { name: '_clsk', provider: 'Microsoft Clarity', purpose: 'Connects page views into a session', expiry: '1 day' } ] }, marketing: { name: 'Marketing', icon: '', description: 'Used to track visitors across websites to display relevant advertisements and measure campaign effectiveness.', alwaysOn: false, cookies: [ { name: '_gcl_au', provider: 'Google Ads', purpose: 'Conversion linker for ad clicks', expiry: '90 days' }, { name: '_uetsid', provider: 'Bing Ads', purpose: 'Tracks session for conversions', expiry: '1 day' }, { name: '_uetvid', provider: 'Bing Ads', purpose: 'Tracks user across sessions', expiry: '13 months' }, { name: '_fuid', provider: 'Factors.ai', purpose: 'Marketing user identification', expiry: '1 year' } ] }, functional: { name: 'Functional', icon: '', description: 'Enable enhanced functionality and personalization such as live chat, videos, and social media integration.', alwaysOn: false, cookies: [] } } }; // ─── Geo Detection (Timezone-based, no API calls) ──────────────────── var GEO = (function () { var gdprTimezones = [ 'Europe/', 'Atlantic/Azores', 'Atlantic/Canary', 'Atlantic/Faroe', 'Atlantic/Madeira', 'Atlantic/Reykjavik', 'Arctic/Longyearbyen' ]; var ccpaTimezones = ['America/Los_Angeles', 'America/Anchorage', 'Pacific/Honolulu']; var lgpdTimezones = ['America/Sao_Paulo', 'America/Fortaleza', 'America/Recife', 'America/Bahia', 'America/Belem', 'America/Manaus', 'America/Cuiaba', 'America/Porto_Velho', 'America/Boa_Vista', 'America/Campo_Grande', 'America/Eirunepe', 'America/Rio_Branco', 'America/Noronha', 'America/Araguaina', 'America/Maceio', 'America/Santarem']; function detect() { try { var tz = Intl.DateTimeFormat().resolvedOptions().timeZone || ''; for (var i = 0; i < gdprTimezones.length; i++) { if (tz.indexOf(gdprTimezones[i]) === 0 || tz === gdprTimezones[i]) return 'gdpr'; } if (tz === 'Asia/Kolkata' || tz === 'Asia/Calcutta' || tz === 'Asia/Colombo') return 'india'; for (var j = 0; j < lgpdTimezones.length; j++) { if (tz === lgpdTimezones[j]) return 'lgpd'; } for (var k = 0; k < ccpaTimezones.length; k++) { if (tz === ccpaTimezones[k]) return 'ccpa'; } return 'default'; } catch (e) { return 'gdpr'; // strictest mode as fallback } } return { detect: detect }; })(); // ─── Cookie Utilities ──────────────────────────────────────────────── var CookieUtil = { set: function (name, value, days) { var d = new Date(); d.setTime(d.getTime() + (days * 86400000)); document.cookie = name + '=' + encodeURIComponent(value) + ';expires=' + d.toUTCString() + ';path=/;SameSite=Lax;Secure'; }, get: function (name) { var match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)')); return match ? decodeURIComponent(match[2]) : null; }, remove: function (name) { document.cookie = name + '=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/;SameSite=Lax'; }, removeTracking: function (categories) { var allCookies = document.cookie.split(';'); for (var cat in CONFIG.categories) { if (cat === 'necessary' || categories[cat]) continue; var cookies = CONFIG.categories[cat].cookies; for (var i = 0; i < cookies.length; i++) { var pattern = cookies[i].name.replace(/\*/g, ''); for (var j = 0; j < allCookies.length; j++) { var cName = allCookies[j].split('=')[0].trim(); if (cName.indexOf(pattern) === 0) { CookieUtil.remove(cName); } } } } } }; // ─── Google Consent Mode v2 ────────────────────────────────────────── var ConsentMode = { init: function (region) { window.dataLayer = window.dataLayer || []; function gtag() { window.dataLayer.push(arguments); } window.gtag = gtag; var denied = 'denied'; var granted = 'granted'; var isOptIn = (region === 'gdpr' || region === 'lgpd' || region === 'india'); gtag('consent', 'default', { 'analytics_storage': isOptIn ? denied : granted, 'ad_storage': isOptIn ? denied : granted, 'ad_user_data': isOptIn ? denied : granted, 'ad_personalization': isOptIn ? denied : granted, 'functionality_storage': isOptIn ? denied : granted, 'security_storage': granted, 'wait_for_update': 500 }); }, update: function (categories) { if (!window.gtag) return; window.gtag('consent', 'update', { 'analytics_storage': categories.analytics ? 'granted' : 'denied', 'ad_storage': categories.marketing ? 'granted' : 'denied', 'ad_user_data': categories.marketing ? 'granted' : 'denied', 'ad_personalization': categories.marketing ? 'granted' : 'denied', 'functionality_storage': categories.functional ? 'granted' : 'denied' }); } }; // ─── Consent State Manager ─────────────────────────────────────────── var Consent = { _state: null, load: function () { var raw = CookieUtil.get(CONFIG.cookieName); if (!raw) return null; try { var parsed = JSON.parse(raw); if (parsed.version !== CONFIG.consentVersion) return null; this._state = parsed; return parsed; } catch (e) { return null; } }, save: function (categories) { var state = { necessary: true, analytics: !!categories.analytics, marketing: !!categories.marketing, functional: !!categories.functional, version: CONFIG.consentVersion, timestamp: Math.floor(Date.now() / 1000), region: GEO.detect() }; this._state = state; CookieUtil.set(CONFIG.cookieName, JSON.stringify(state), CONFIG.cookieExpiry); ConsentMode.update(state); CookieUtil.removeTracking(state); return state; }, get: function () { return this._state; } }; // ─── CSS Injection ─────────────────────────────────────────────────── function injectStyles() { var css = '' + /* Reset & Base */ '#tms-cb *, #tms-cb *::before, #tms-cb *::after { box-sizing: border-box; margin: 0; }' + '#tms-cb { font-family: "Open Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; font-size: 14px; line-height: 1.5; color: #4D4D4D; -webkit-font-smoothing: antialiased; }' + /* Banner */ '.tms-cb-banner { position: fixed; bottom: 0; left: 0; right: 0; z-index: 999999; background: #ffffff; box-shadow: 0 -4px 24px rgba(0,0,0,0.12); border-top: 3px solid #1F4F7A; transform: translateY(100%); transition: transform 0.4s cubic-bezier(0.22, 1, 0.36, 1); padding: 0; }' + '.tms-cb-banner.tms-cb-visible { transform: translateY(0); }' + '.tms-cb-banner-inner { max-width: 1200px; margin: 0 auto; padding: 24px 42px; display: flex; align-items: center; gap: 32px; }' + '.tms-cb-banner-text { flex: 1; }' + '.tms-cb-banner-title { font-family: "Montserrat", "Open Sans", sans-serif; font-size: 16px; font-weight: 700; color: #1F4F7A; margin-bottom: 6px; display: flex; align-items: center; gap: 8px; }' + '.tms-cb-banner-desc { font-size: 13px; color: #4D4D4D; line-height: 1.6; }' + '.tms-cb-banner-desc a { color: #1F4F7A; text-decoration: underline; }' + '.tms-cb-banner-desc a:hover { color: #2A3951; }' + '.tms-cb-banner-actions { display: flex; gap: 10px; flex-shrink: 0; align-items: center; }' + /* Buttons */ '.tms-cb-btn { font-family: "Open Sans", sans-serif; font-size: 13px; font-weight: 600; padding: 10px 22px; border-radius: 4px; border: none; cursor: pointer; transition: all 0.2s ease; white-space: nowrap; letter-spacing: 0.3px; outline: none; }' + '.tms-cb-btn:focus-visible { outline: 2px solid #1F4F7A; outline-offset: 2px; }' + '.tms-cb-btn-primary { background: #1F4F7A; color: #ffffff; }' + '.tms-cb-btn-primary:hover { background: #163d5f; }' + '.tms-cb-btn-secondary { background: transparent; color: #1F4F7A; border: 1.5px solid #1F4F7A; }' + '.tms-cb-btn-secondary:hover { background: #f0f4f8; }' + '.tms-cb-btn-ghost { background: transparent; color: #455075; border: 1.5px solid #d0d5dd; }' + '.tms-cb-btn-ghost:hover { background: #f5f5f5; border-color: #aab0be; }' + /* Overlay */ '.tms-cb-overlay { position: fixed; inset: 0; z-index: 1000000; background: rgba(0,0,0,0.5); display: flex; align-items: center; justify-content: center; opacity: 0; visibility: hidden; transition: opacity 0.3s ease, visibility 0.3s ease; padding: 16px; backdrop-filter: blur(2px); }' + '.tms-cb-overlay.tms-cb-visible { opacity: 1; visibility: visible; }' + /* Modal */ '.tms-cb-modal { background: #ffffff; border-radius: 8px; max-width: 680px; width: 100%; max-height: 85vh; display: flex; flex-direction: column; box-shadow: 0 20px 60px rgba(0,0,0,0.2); transform: scale(0.95) translateY(10px); transition: transform 0.3s cubic-bezier(0.22, 1, 0.36, 1); overflow: hidden; border-top: 3px solid #1F4F7A; }' + '.tms-cb-overlay.tms-cb-visible .tms-cb-modal { transform: scale(1) translateY(0); }' + /* Modal Header */ '.tms-cb-modal-header { padding: 28px 44px 20px; border-bottom: 1px solid #e8eaed; display: flex; align-items: center; justify-content: space-between; flex-shrink: 0; }' + '.tms-cb-modal-title { font-family: "Montserrat", "Open Sans", sans-serif; font-size: 18px; font-weight: 700; color: #1F4F7A; }' + '.tms-cb-modal-close { width: 32px; height: 32px; border-radius: 50%; border: none; background: #f0f2f5; color: #455075; cursor: pointer; display: flex; align-items: center; justify-content: center; font-size: 18px; transition: all 0.2s; }' + '.tms-cb-modal-close:hover { background: #e0e3e8; color: #1F4F7A; }' + '.tms-cb-modal-close:focus-visible { outline: 2px solid #1F4F7A; outline-offset: 2px; }' + /* Modal Body */ '.tms-cb-modal-body { padding: 12px 44px 16px; overflow-y: auto; flex: 1; }' + '.tms-cb-modal-intro { font-size: 13px; color: #4D4D4D; line-height: 1.6; padding: 12px 0 8px; }' + '.tms-cb-modal-intro a { color: #1F4F7A; text-decoration: underline; }' + /* Category */ '.tms-cb-cat { border-bottom: 1px solid #eef0f3; padding: 18px 0; }' + '.tms-cb-cat:last-child { border-bottom: none; }' + '.tms-cb-cat-header { display: flex; align-items: flex-start; gap: 14px; }' + '.tms-cb-cat-info { flex: 1; min-width: 0; }' + '.tms-cb-cat-name { font-family: "Montserrat", "Open Sans", sans-serif; font-size: 14px; font-weight: 700; color: #1F4F7A; display: flex; align-items: center; }' + '.tms-cb-cat-count { font-size: 11px; color: #8891a5; margin-left: 8px; font-weight: 400; font-family: "Open Sans", sans-serif; }' + '.tms-cb-cat-desc { font-size: 12.5px; color: #6b7280; line-height: 1.55; margin-top: 3px; }' + '.tms-cb-cat-badge { display: inline-block; font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.6px; padding: 2px 8px; border-radius: 3px; margin-left: 8px; }' + '.tms-cb-cat-badge-on { background: #e8f0f7; color: #1F4F7A; }' + /* Toggle */ '.tms-cb-toggle { position: relative; width: 44px; height: 24px; flex-shrink: 0; }' + '.tms-cb-toggle input { opacity: 0; width: 0; height: 0; position: absolute; }' + '.tms-cb-toggle-slider { position: absolute; inset: 0; background: #d0d5dd; border-radius: 12px; cursor: pointer; transition: background 0.25s ease; }' + '.tms-cb-toggle-slider::after { content: ""; position: absolute; width: 18px; height: 18px; background: #fff; border-radius: 50%; top: 3px; left: 3px; transition: transform 0.25s ease; box-shadow: 0 1px 3px rgba(0,0,0,0.15); }' + '.tms-cb-toggle input:checked + .tms-cb-toggle-slider { background: #1F4F7A; }' + '.tms-cb-toggle input:checked + .tms-cb-toggle-slider::after { transform: translateX(20px); }' + '.tms-cb-toggle input:disabled + .tms-cb-toggle-slider { background: #1F4F7A; opacity: 0.6; cursor: default; }' + '.tms-cb-toggle input:focus-visible + .tms-cb-toggle-slider { outline: 2px solid #1F4F7A; outline-offset: 2px; }' + /* Cookie Detail Table */ '.tms-cb-details-btn { background: none; border: none; color: #1F4F7A; font-size: 12px; cursor: pointer; padding: 4px 0; margin-top: 4px; font-weight: 600; display: inline-flex; align-items: center; gap: 4px; }' + '.tms-cb-details-btn:hover { text-decoration: underline; }' + '.tms-cb-details-btn:focus-visible { outline: 2px solid #1F4F7A; outline-offset: 2px; }' + '.tms-cb-details-arrow { display: inline-block; transition: transform 0.2s; font-size: 10px; }' + '.tms-cb-details-arrow.tms-cb-expanded { transform: rotate(90deg); }' + '.tms-cb-cookie-table { width: 100%; margin-top: 8px; border-collapse: collapse; font-size: 12px; display: none; }' + '.tms-cb-cookie-table.tms-cb-visible { display: table; }' + '.tms-cb-cookie-table th { text-align: left; padding: 8px 14px; background: #f5f7fa; color: #455075; font-weight: 600; border-bottom: 1px solid #e0e3e8; font-size: 11px; text-transform: uppercase; letter-spacing: 0.5px; }' + '.tms-cb-cookie-table td { padding: 8px 14px; border-bottom: 1px solid #f0f2f5; color: #4D4D4D; vertical-align: top; }' + '.tms-cb-cookie-table tr:last-child td { border-bottom: none; }' + /* Modal Footer */ '.tms-cb-modal-footer { padding: 22px 44px; border-top: 1px solid #e8eaed; display: flex; justify-content: flex-end; gap: 12px; flex-shrink: 0; background: #fafbfc; }' + /* Floating Button */ '.tms-cb-float { position: fixed; bottom: 20px; left: 20px; z-index: 999998; width: 40px; height: 40px; border-radius: 6px; background: #1F4F7A; color: #fff; border: none; cursor: pointer; display: flex; align-items: center; justify-content: center; box-shadow: 0 2px 10px rgba(31,79,122,0.3); transition: all 0.3s ease; opacity: 0; visibility: hidden; transform: scale(0.8); }' + '.tms-cb-float.tms-cb-visible { opacity: 1; visibility: visible; transform: scale(1); }' + '.tms-cb-float:hover { background: #163d5f; transform: scale(1.04); box-shadow: 0 4px 14px rgba(31,79,122,0.4); }' + '.tms-cb-float:focus-visible { outline: 2px solid #1F4F7A; outline-offset: 3px; }' + '.tms-cb-float svg { width: 20px; height: 20px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }' + /* CCPA-specific link */ '.tms-cb-ccpa-link { font-size: 12px; color: #1F4F7A; text-decoration: underline; cursor: pointer; background: none; border: none; padding: 0; }' + /* Mobile Responsive */ '@media (max-width: 768px) {' + '.tms-cb-banner-inner { flex-direction: column; padding: 20px 24px; gap: 14px; text-align: center; }' + '.tms-cb-banner-actions { width: 100%; justify-content: center; flex-wrap: wrap; }' + '.tms-cb-btn { padding: 10px 16px; flex: 1; min-width: 100px; font-size: 12.5px; }' + '.tms-cb-modal { max-height: 90vh; border-radius: 8px 8px 0 0; margin-top: auto; }' + '.tms-cb-overlay { align-items: flex-end; padding: 0; }' + '.tms-cb-modal-body { padding: 10px 28px 14px; }' + '.tms-cb-modal-header { padding: 22px 28px 16px; }' + '.tms-cb-modal-footer { padding: 18px 28px; flex-wrap: wrap; }' + '.tms-cb-modal-footer .tms-cb-btn { flex: 1; }' + '.tms-cb-cat-header { gap: 10px; }' + '}' + '@media (max-width: 400px) {' + '.tms-cb-banner-actions { flex-direction: column; }' + '.tms-cb-btn { width: 100%; }' + '}' + /* Animations */ '@keyframes tms-cb-fadeIn { from { opacity: 0; } to { opacity: 1; } }' + /* Print: hide everything */ '@media print { #tms-cb { display: none !important; } }'; var style = document.createElement('style'); style.id = 'tms-cb-styles'; style.textContent = css; document.head.appendChild(style); } // ─── UI Builder ────────────────────────────────────────────────────── var UI = { container: null, banner: null, overlay: null, floatBtn: null, region: 'gdpr', build: function (region) { this.region = region; this.container = document.createElement('div'); this.container.id = 'tms-cb'; this.container.setAttribute('role', 'region'); this.container.setAttribute('aria-label', 'Cookie consent'); this._buildBanner(); this._buildModal(); this._buildFloat(); document.body.appendChild(this.container); }, _buildBanner: function () { var isCCPA = this.region === 'ccpa'; var b = document.createElement('div'); b.className = 'tms-cb-banner'; b.setAttribute('role', 'dialog'); b.setAttribute('aria-label', 'Cookie consent banner'); b.setAttribute('aria-describedby', 'tms-cb-banner-desc'); var html = '
'; b.innerHTML = html; this.banner = b; this.container.appendChild(b); // Bind actions var buttons = b.querySelectorAll('[data-action]'); for (var i = 0; i < buttons.length; i++) { buttons[i].addEventListener('click', this._handleBannerAction.bind(this)); } }, _buildModal: function () { var ov = document.createElement('div'); ov.className = 'tms-cb-overlay'; ov.setAttribute('role', 'dialog'); ov.setAttribute('aria-modal', 'true'); ov.setAttribute('aria-label', 'Cookie preference settings'); var modal = document.createElement('div'); modal.className = 'tms-cb-modal'; // Header var header = '| Cookie | Provider | Purpose | Expiry |
|---|---|---|---|
| ' + ck.name + ' | ' + ck.provider + ' | ' + ck.purpose + ' | ' + ck.expiry + ' |
HR analyst and content writer at Team Management Services specializing in talent acquisition, apprenticeship schemes (NATS, NAPS), and workforce development. Akash covers government employment programs and hiring solutions for growing businesses in India.