(function () { /* Copado demo drawer, generic config-driven build generic-2026-11-03-cicd. Derived from the Gearset vs Copado Enterprise compare drawer (build 2026-11-02-lead-push-linkfix). Inert unless window.GV_DRAWER_CONFIG is set before this file loads and its pathRe matches the page path. Config keys: pathRe (RegExp, required), formType (string, required), ssKey (string, required), ctaSelector (default 'a[data-demo-drawer]'), pageGuard (optional selector that must exist), booker (default false = details-only, no Qualified), consentPrompt (default false, only used with booker), qualifiedExperience (only used with booker), hideOnOpen (optional selector hidden while open), clickIdsNeedAdConsent (default false), pushLead (default true), endpoint/timeoutMs/graceMs/minFillMs/postEmptyTracking/readResult. */ var GV_DD_TPL = ""; var GV_DD_CSS = "#gv-dd [hidden]{display:none!important}\n#gv-dd{position:fixed;inset:0;z-index:2147483000;font-family:Montserrat,sans-serif;color:#000;-webkit-text-size-adjust:100%;--gv-dd-ok:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3.5 8.5l3 3 6-7' fill='none' stroke='%23fff' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\");--gv-dd-bad:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Ccircle cx='8' cy='8' r='7' fill='%23b3261e'/%3E%3Cpath d='M8 4.5v4.2' stroke='%23fff' stroke-width='1.8' stroke-linecap='round'/%3E%3Ccircle cx='8' cy='11.4' r='1' fill='%23fff'/%3E%3C/svg%3E\")}\n#gv-dd *{box-sizing:border-box}\n#gv-dd .gv-dd-dim{position:absolute;inset:0;background:rgba(10,20,60,.45);-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);opacity:0;transition:opacity .3s ease}\n#gv-dd .gv-dd-panel{position:absolute;top:0;right:0;bottom:0;width:440px;max-width:100%;display:flex;flex-direction:column;background:#fff;border-radius:16px 0 0 16px;box-shadow:-16px 0 48px rgba(16,32,96,.18),0 0 10px #65778340;transform:translateX(100%);transition:transform .3s cubic-bezier(.22,1,.36,1);overflow:hidden}\n#gv-dd .gv-dd-panel::before{content:\"\";position:absolute;top:0;left:0;right:0;height:4px;background:linear-gradient(90deg,#965ee2,#2463eb 50%,#4dc7eb)}\n#gv-dd.is-open .gv-dd-dim{opacity:1}\n#gv-dd.is-open .gv-dd-panel{transform:none}\n#gv-dd .gv-dd-head{flex:none;display:flex;align-items:center;justify-content:space-between;gap:16px;padding:28px 24px 20px;background:linear-gradient(145deg,#e6edfc,#f4f7fe 55%,#e8f9fe);border-bottom:1px solid #e1e4e9}\n#gv-dd .gv-dd-title{margin:0;font-family:Montserrat,sans-serif;font-size:28px;font-weight:700;line-height:34px;letter-spacing:-.01em;color:#000}\n#gv-dd .gv-dd-close{flex:none;display:inline-flex;align-items:center;gap:8px;min-height:44px;min-width:44px;margin:0 0 0 auto;padding:0 16px 0 14px;background:#fff;border:1px solid #c9d3ee;border-radius:999px;font:600 14px/20px Montserrat,sans-serif;color:#2463eb;cursor:pointer;transition:background-color .15s,border-color .15s}\n#gv-dd .gv-dd-close::before{content:\"\";width:12px;height:12px;background:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14'%3E%3Cpath d='M2 2l10 10M12 2L2 12' stroke='%232463eb' stroke-width='2.2' stroke-linecap='round'/%3E%3C/svg%3E\") center/contain no-repeat}\n#gv-dd .gv-dd-form{flex:1 1 auto;min-height:0;display:flex;flex-direction:column;margin:0}\n#gv-dd .gv-dd-body{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;padding:24px;display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:20px 12px;align-content:start}\n#gv-dd .gv-dd-body>*{grid-column:1/-1}\n#gv-dd .gv-dd-foot{flex:none;padding:16px 24px 24px;background:#fff;border-top:1px solid #eef1f6;box-shadow:0 -8px 24px rgba(16,32,96,.06)}\n#gv-dd .gv-dd-field{display:flex;flex-direction:column;gap:8px;margin:0}\n#gv-dd label{display:block;margin:0;font-size:14px;font-weight:600;line-height:20px;color:#14182f}\n#gv-dd input[type=text],#gv-dd input[type=email],#gv-dd select{display:block;width:100%;min-height:48px;margin:0;padding:12px 14px;font:400 16px/22px Montserrat,sans-serif;color:#000;background-color:#fff;border:1px solid #7d86a3;border-radius:8px;box-shadow:0 1px 2px rgba(16,32,96,.06);-webkit-appearance:none;appearance:none;transition:border-color .15s,box-shadow .15s}\n#gv-dd input[type=text]:focus,#gv-dd input[type=email]:focus,#gv-dd select:focus{border-color:#2463eb}\n#gv-dd select{padding-right:44px;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' fill='none' stroke='%232463eb' stroke-width='2' stroke-linecap='round'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 16px center;cursor:pointer}\n#gv-dd input[aria-invalid=true],#gv-dd select[aria-invalid=true]{border-color:#b3261e!important;background-color:#fffafa;box-shadow:inset 0 0 0 1px #b3261e}\n#gv-dd .gv-dd-consent{padding:14px 16px;background:#f4f7fe;border:1px solid #dbe3f8;border-radius:10px}\n#gv-dd .gv-dd-check{display:flex;align-items:flex-start;gap:12px;min-height:44px}\n#gv-dd .gv-dd-check input{flex:none;width:22px;height:22px;margin:1px 0 0;-webkit-appearance:none;appearance:none;background:#fff center/14px no-repeat;border:2px solid #535b7c;border-radius:6px;cursor:pointer;transition:background-color .15s,border-color .15s}\n#gv-dd .gv-dd-check input:checked{background-color:#2463eb;background-image:var(--gv-dd-ok);border-color:#2463eb}\n#gv-dd .gv-dd-check input[aria-invalid=true]{box-shadow:none}\n#gv-dd .gv-dd-check label{font-weight:500;font-size:14px;line-height:22px;cursor:pointer}\n#gv-dd .gv-dd-err,#gv-dd .cpd-email-error{display:flex;gap:6px;margin:0;font-size:14px;font-weight:600;line-height:20px;color:#b3261e}\n#gv-dd .gv-dd-err::before,#gv-dd .cpd-email-error::before{content:\"\";flex:none;width:16px;height:16px;margin-top:2px;background:var(--gv-dd-bad) center/contain no-repeat}\n#gv-dd .gv-dd-summary,#gv-dd .gv-dd-fail{margin:0;padding:14px 16px 14px 44px;border:1px solid #f1c2bd;border-left:4px solid #b3261e;border-radius:8px;font-size:14px;font-weight:600;line-height:20px;color:#8c1d18;background:#fdf4f3 var(--gv-dd-bad) 16px 16px/18px no-repeat}\n#gv-dd .gv-dd-summary ul{margin:0;padding:0 0 0 18px;list-style:disc}\n#gv-dd .gv-dd-summary li{margin:0;padding:0;font-size:14px;line-height:22px;list-style:disc}\n#gv-dd a{background:none}\n#gv-dd .gv-dd-summary a,#gv-dd .gv-dd-fail a{color:#8c1d18;text-decoration:underline}\n#gv-dd .gv-dd-notice{margin:0;font-size:13px;line-height:20px;color:#535b7c}\n#gv-dd .gv-dd-notice a{color:#2463eb;text-decoration:underline;text-underline-offset:2px}\n#gv-dd .gv-dd-hp{position:absolute!important;left:-10000px!important;top:auto;width:1px;height:1px;overflow:hidden}\n#gv-dd .gv-dd-submit{display:block;width:100%;min-height:52px;margin:0;padding:14px 18px;border:0;border-radius:4px;color:#fff;background-color:#2463eb;background-image:linear-gradient(156deg,#2463eb 40%,#0077b6 80%);box-shadow:0 4px 14px rgba(36,99,235,.28);font:600 16px/24px Montserrat,sans-serif;text-align:center;cursor:pointer;transition:box-shadow .15s,transform .15s}\n#gv-dd .gv-dd-submit:active{transform:translateY(1px);box-shadow:0 2px 8px rgba(36,99,235,.3)}\n#gv-dd .gv-dd-submit[aria-disabled=true]{opacity:.75;cursor:progress;transform:none;box-shadow:none}\n#gv-dd .gv-dd-submit[aria-disabled=true]::after{content:\"\";display:inline-block;width:16px;height:16px;margin-left:10px;vertical-align:-3px;border:2px solid rgba(255,255,255,.45);border-top-color:#fff;border-radius:50%;animation:gv-dd-spin .8s linear infinite}\n@keyframes gv-dd-spin{to{transform:rotate(360deg)}}\n#gv-dd .gv-dd-done{flex:1 1 auto;overflow-y:auto;padding:56px 32px;text-align:center}\n#gv-dd .gv-dd-done::before{content:\"\";display:block;width:64px;height:64px;margin:0 auto 24px;border-radius:50%;background:var(--gv-dd-ok) center/28px no-repeat,linear-gradient(156deg,#2463eb 40%,#0077b6 80%);box-shadow:0 8px 24px rgba(36,99,235,.25)}\n#gv-dd .gv-dd-done .gv-dd-title{font-size:24px;line-height:32px;text-align:center}\n#gv-dd .gv-dd-done-text{max-width:320px;margin:12px auto 0;text-align:center;font-size:16px;line-height:24px;color:#535b7c}\n#gv-dd .gv-dd-frame{position:absolute;width:1px;height:1px;left:-10000px;top:0;border:0;visibility:hidden}\n#gv-dd :focus{outline:none}\n#gv-dd :focus-visible,#gv-dd input[type=text]:focus,#gv-dd input[type=email]:focus,#gv-dd select:focus{outline:3px solid #00c3ef;outline-offset:2px}\n#gv-dd .gv-dd-title:focus:not(:focus-visible){outline:none}\nhtml.gv-dd-open{overflow:hidden}\nhtml.gv-dd-open body{overflow:hidden}\n#gv-dd .gv-dd-consent-actions{margin:24px auto 0;max-width:320px;text-align:center}\n#gv-dd .gv-dd-consent-btn{display:inline-flex;align-items:center;justify-content:center;min-height:48px;padding:12px 20px;border:0;border-radius:8px;background:#2463eb;color:#fff;font:600 15px/20px Montserrat,sans-serif;cursor:pointer}\n#gv-dd .gv-dd-consent-btn:hover{background:#1d4fc0}\n#gv-dd .gv-dd-consent-note{margin:10px 0 0;font-size:12px;line-height:16px;color:#7d86a3}\n@media (hover:hover){\n #gv-dd .gv-dd-close:hover{background:#eef3fe;border-color:#2463eb}\n #gv-dd input[type=text]:hover:not(:focus),#gv-dd input[type=email]:hover:not(:focus),#gv-dd select:hover:not(:focus){border-color:#535b7c}\n #gv-dd .gv-dd-submit:hover{background-image:linear-gradient(156deg,#1d4fbd 40%,#005f91 80%);box-shadow:0 6px 20px rgba(36,99,235,.36)}\n}\n@media (min-width:768px){\n #gv-dd .gv-dd-field:has(#gv-dd-first_name),#gv-dd .gv-dd-field:has(#gv-dd-last_name){grid-column:auto}\n}\n@media (max-width:767px){\n #gv-dd .gv-dd-panel{top:var(--gv-dd-top,0px);bottom:auto;left:0;width:100%;height:var(--gv-dd-h,100%);border-radius:0;box-shadow:none}\n #gv-dd .gv-dd-head{padding:20px 20px 16px}\n #gv-dd .gv-dd-title{font-size:24px;line-height:30px}\n #gv-dd .gv-dd-body{padding:20px}\n #gv-dd .gv-dd-foot{padding:12px 20px calc(16px + env(safe-area-inset-bottom,0px))}\n}\n@media (prefers-reduced-motion:reduce){\n #gv-dd .gv-dd-dim,#gv-dd .gv-dd-panel,#gv-dd .gv-dd-submit{transition:none}\n #gv-dd .gv-dd-submit[aria-disabled=true]::after{animation:none}\n}\n@media (forced-colors:active){\n #gv-dd .gv-dd-check input{-webkit-appearance:auto;appearance:auto}\n}"; var GV_DD_QCSS = "html:has(#gv-dd.is-open #gv-dd-form:not([hidden])) #q-messenger-frame,\nhtml:has(#gv-dd.is-open #gv-dd-form:not([hidden])) #q-messenger-frame-skip-link{visibility:hidden !important;pointer-events:none !important}"; (function () { 'use strict'; var C = window.GV_DRAWER_CONFIG; if (!C || typeof C !== 'object') return; var PATH_RE = C.pathRe instanceof RegExp ? C.pathRe : null; if (!PATH_RE || !PATH_RE.test(window.location.pathname)) return; if (C.pageGuard && !document.querySelector(C.pageGuard)) return; if (window.GVDemoDrawer) return; if (typeof C.formType !== 'string' || !C.formType || typeof C.ssKey !== 'string' || !C.ssKey) return; if (!document.body || !('content' in document.createElement('template'))) return; var GV_PUSH_GENERATE_LEAD = C.pushLead !== false; var GV_FORM_TYPE = C.formType; var GV_SS_KEY = C.ssKey; // booker false = details-only: no Qualified calls, plain thank-you after a confirmed submit. var GV_BOOKER = C.booker === true; // Click IDs are read the same way as UTMs unless a page opts in to an advertising-consent gate. var CLICK_IDS_NEED_AD_CONSENT = C.clickIdsNeedAdConsent === true; var CLICK_ID_KEYS = ['gclid', 'msclkid', 'gbraid', 'wbraid', 'li_fat_id', 'rdt_cid']; var css = GV_DD_CSS; if (typeof C.hideOnOpen === 'string' && C.hideOnOpen) css += '\nhtml.gv-dd-open ' + C.hideOnOpen.split(',').join(',html.gv-dd-open ') + '{visibility:hidden}'; if (GV_BOOKER) css += '\n' + GV_DD_QCSS; var styleEl = document.createElement('style'); styleEl.id = 'gv-dd-style'; styleEl.textContent = css; (document.head || document.documentElement).appendChild(styleEl); var tpl = document.createElement('template'); tpl.innerHTML = GV_DD_TPL; // Mirrors Qualified's blocked personal-domain list. var FREE_DOMAINS = [ 'aol.com', 'att.net', 'comcast.net', 'facebook.com', 'gmail.com', 'gmx.com', 'google.com', 'hotmail.com', 'hotmail.co.uk', 'mac.com', 'me.com', 'mail.com', 'msn.com', 'live.com', 'sbcglobal.net', 'verizon.net', 'yahoo.com', 'yahoo.co.uk', 'email.com', 'fastmail.fm', 'games.com', 'gmx.net', 'hush.com', 'hushmail.com', 'icloud.com', 'iname.com', 'inbox.com', 'lavabit.com', 'love.com', 'outlook.com', 'pobox.com', 'protonmail.ch', 'protonmail.com', 'tutanota.de', 'tutanota.com', 'tutamail.com', 'tuta.io', 'keemail.me', 'rocketmail.com', 'safe-mail.net', 'wow.com', 'ygm.com', 'ymail.com', 'zoho.com', 'yandex.com', 'bellsouth.net', 'charter.net', 'cox.net', 'earthlink.net', 'juno.com', 'btinternet.com', 'virginmedia.com', 'blueyonder.co.uk', 'freeserve.co.uk', 'live.co.uk', 'ntlworld.com', 'o2.co.uk', 'orange.net', 'sky.com', 'talktalk.co.uk', 'tiscali.co.uk', 'virgin.net', 'wanadoo.co.uk', 'bt.com', 'sina.com', 'sina.cn', 'qq.com', 'naver.com', 'hanmail.net', 'daum.net', 'nate.com', 'yahoo.co.jp', 'yahoo.co.kr', 'yahoo.co.id', 'yahoo.co.in', 'yahoo.com.sg', 'yahoo.com.ph', '163.com', 'yeah.net', '126.com', '21cn.com', 'aliyun.com', 'foxmail.com', 'hotmail.fr', 'live.fr', 'laposte.net', 'yahoo.fr', 'wanadoo.fr', 'orange.fr', 'gmx.fr', 'sfr.fr', 'neuf.fr', 'free.fr', 'gmx.de', 'hotmail.de', 'live.de', 'online.de', 't-online.de', 'web.de', 'yahoo.de', 'libero.it', 'virgilio.it', 'hotmail.it', 'aol.it', 'tiscali.it', 'alice.it', 'live.it', 'yahoo.it', 'email.it', 'tin.it', 'poste.it', 'teletu.it', 'mail.ru', 'rambler.ru', 'yandex.ru', 'ya.ru', 'list.ru', 'hotmail.be', 'live.be', 'skynet.be', 'voo.be', 'tvcablenet.be', 'telenet.be', 'hotmail.com.ar', 'live.com.ar', 'yahoo.com.ar', 'fibertel.com.ar', 'speedy.com.ar', 'arnet.com.ar', 'yahoo.com.mx', 'live.com.mx', 'hotmail.es', 'hotmail.com.mx', 'prodigy.net.mx', 'yahoo.ca', 'hotmail.ca', 'bell.net', 'shaw.ca', 'sympatico.ca', 'rogers.com', 'yahoo.com.br', 'hotmail.com.br', 'outlook.com.br', 'uol.com.br', 'bol.com.br', 'terra.com.br', 'ig.com.br', 'itelefonica.com.br', 'r7.com', 'zipmail.com.br', 'globo.com', 'globomail.com', 'oi.com.br', 'mailinator.com' ]; // Pardot country labels, in Pardot's order. The label is the posted value. var COUNTRIES = [ 'United States', 'Canada', 'Afghanistan', 'Albania', 'Algeria', 'American Samoa', 'Andorra', 'Angola', 'Anguilla', 'Antarctica', 'Antigua and Barbuda', 'Argentina', 'Armenia', 'Aruba', 'Australia', 'Austria', 'Azerbaijan', 'Bahamas', 'Bahrain', 'Bangladesh', 'Barbados', 'Belarus', 'Belgium', 'Belize', 'Benin', 'Bermuda', 'Bhutan', 'Bolivia', 'Bosnia and Herzegovina', 'Botswana', 'Brazil', 'British Indian Ocean Territory', 'British Virgin Islands', 'Brunei', 'Bulgaria', 'Burkina Faso', 'Burundi', 'Cambodia', 'Cameroon', 'Cape Verde', 'Cayman Islands', 'Central African Republic', 'Chad', 'Chile', 'China', 'Christmas Island', 'Cocos (Keeling) Islands', 'Colombia', 'Comoros', 'Congo', 'Cook Islands', 'Costa Rica', 'Croatia', 'Cuba', 'Cura\u00e7ao', 'Cyprus', 'Czech Republic', 'C\u00f4te d\u2019Ivoire', 'Democratic Republic of the Congo', 'Denmark', 'Djibouti', 'Dominica', 'Dominican Republic', 'Ecuador', 'Egypt', 'El Salvador', 'Equatorial Guinea', 'Eritrea', 'Estonia', 'Ethiopia', 'Falkland Islands', 'Faroe Islands', 'Fiji', 'Finland', 'France', 'French Guiana', 'French Polynesia', 'French Southern Territories', 'Gabon', 'Gambia', 'Georgia', 'Germany', 'Ghana', 'Gibraltar', 'Greece', 'Greenland', 'Grenada', 'Guadeloupe', 'Guam', 'Guatemala', 'Guernsey', 'Guinea', 'Guinea-Bissau', 'Guyana', 'Haiti', 'Honduras', 'Hong Kong S.A.R., China', 'Hungary', 'Iceland', 'India', 'Indonesia', 'Iran', 'Iraq', 'Ireland', 'Isle of Man', 'Israel', 'Italy', 'Jamaica', 'Japan', 'Jersey', 'Jordan', 'Kazakhstan', 'Kenya', 'Kiribati', 'Kuwait', 'Kyrgyzstan', 'Laos', 'Latvia', 'Lebanon', 'Lesotho', 'Liberia', 'Libya', 'Liechtenstein', 'Lithuania', 'Luxembourg', 'Macao S.A.R., China', 'Macedonia', 'Madagascar', 'Malawi', 'Malaysia', 'Maldives', 'Mali', 'Malta', 'Marshall Islands', 'Martinique', 'Mauritania', 'Mauritius', 'Mayotte', 'Mexico', 'Micronesia', 'Moldova', 'Monaco', 'Mongolia', 'Montenegro', 'Montserrat', 'Morocco', 'Mozambique', 'Myanmar', 'Namibia', 'Nauru', 'Nepal', 'Netherlands', 'New Caledonia', 'New Zealand', 'Nicaragua', 'Niger', 'Nigeria', 'Niue', 'Norfolk Island', 'North Korea', 'Northern Mariana Islands', 'Norway', 'Oman', 'Pakistan', 'Palau', 'Palestinian Territory', 'Panama', 'Papua New Guinea', 'Paraguay', 'Peru', 'Philippines', 'Pitcairn', 'Poland', 'Portugal', 'Puerto Rico', 'Qatar', 'Romania', 'Russia', 'Rwanda', 'R\u00e9union', 'Saint Barth\u00e9lemy', 'Saint Helena', 'Saint Kitts and Nevis', 'Saint Lucia', 'Saint Pierre and Miquelon', 'Saint Vincent and the Grenadines', 'Samoa', 'San Marino', 'Sao Tome and Principe', 'Saudi Arabia', 'Senegal', 'Serbia', 'Seychelles', 'Sierra Leone', 'Singapore', 'Slovakia', 'Slovenia', 'Solomon Islands', 'Somalia', 'South Africa', 'South Korea', 'South Sudan', 'Spain', 'Sri Lanka', 'Sudan', 'Suriname', 'Svalbard and Jan Mayen', 'Swaziland', 'Sweden', 'Switzerland', 'Syria', 'Taiwan', 'Tajikistan', 'Tanzania', 'Thailand', 'Timor-Leste', 'Togo', 'Tokelau', 'Tonga', 'Trinidad and Tobago', 'Tunisia', 'Turkey', 'Turkmenistan', 'Turks and Caicos Islands', 'Tuvalu', 'U.S. Virgin Islands', 'Uganda', 'Ukraine', 'United Arab Emirates', 'United Kingdom', 'United States Minor Outlying Islands', 'Uruguay', 'Uzbekistan', 'Vanuatu', 'Vatican', 'Venezuela', 'Viet Nam', 'Wallis and Futuna', 'Western Sahara', 'Yemen', 'Zambia', 'Zimbabwe' ]; var CONSENT_COUNTRIES = ['Austria', 'Belgium', 'Bulgaria', 'Cyprus', 'Czech Republic', 'Denmark', 'Finland', 'Germany', 'Greece', 'Italy', 'Lithuania', 'Malta', 'Netherlands', 'Poland', 'Portugal', 'Romania', 'Spain', 'Iceland', 'Liechtenstein', 'Norway', 'Switzerland', 'Canada', 'South Korea', 'China', 'South Africa', 'India']; var MSG_REQUIRED = 'This field is required.'; var MSG_EMAIL = 'Please enter your business email address.'; var COOKIE_NAME = '__gtm_url_with_params'; function readResult(frame) { var href; try { href = frame.contentWindow.location.href; } catch (e) { return 'unreadable'; } if (!href || href === 'about:blank') return 'blank'; var m = /[?&]fh=(ok|err)(?:&|#|$)/.exec(href); return m ? m[1] : 'unknown'; } var cfg = { endpoint: 'https://go.copado.com/l/372431/2026-10-30/6xlvjy', timeoutMs: 20000, graceMs: 4000, minFillMs: 3000, postEmptyTracking: false, readResult: readResult }; var overrides = C; Object.keys(cfg).forEach(function (k) { if (overrides[k] !== undefined && typeof overrides[k] === typeof cfg[k]) cfg[k] = overrides[k]; }); document.body.appendChild(tpl.content.cloneNode(true)); var root = document.getElementById('gv-dd'); var panel = root.querySelector('.gv-dd-panel'); var form = root.querySelector('#gv-dd-form'); var title = root.querySelector('#gv-dd-title'); var summary = root.querySelector('#gv-dd-summary'); var fail = root.querySelector('#gv-dd-fail'); var done = root.querySelector('#gv-dd-done'); var doneText = root.querySelector('#gv-dd-done-text'); var consentActions = root.querySelector('#gv-dd-consent-actions'); var openPrefsBtn = root.querySelector('#gv-dd-open-prefs'); var submitBtn = root.querySelector('.gv-dd-submit'); var frame = root.querySelector('.gv-dd-frame'); var country = form.elements.country; var consent = form.elements.marketing_consent; var consentWrap = root.querySelector('#gv-dd-consent-wrap'); var canada = root.querySelector('#gv-dd-canada'); var emailInput = form.elements.email; var emailWrap = emailInput.closest('.gv-dd-field'); var mobileMq = window.matchMedia('(max-width: 767px)'); var reduceMq = window.matchMedia('(prefers-reduced-motion: reduce)'); form.action = cfg.endpoint; COUNTRIES.forEach(function (name) { var o = document.createElement('option'); o.value = name; o.textContent = name; country.appendChild(o); }); var isOpen = false, opener = null, firstOpenedAt = 0, closeTimer = 0; var pending = false, resultTimer = 0, graceTimer = 0, leadPushed = false; var touched = {}; function labelFor(el) { if (el.getAttribute('data-gv-dd-summary')) return el.getAttribute('data-gv-dd-summary'); var l = root.querySelector('label[for="' + el.id + '"]'); return l ? l.textContent : el.name; } function consentShown() { return CONSENT_COUNTRIES.indexOf(country.value) !== -1; } function updateCountry() { var show = consentShown(); consentWrap.hidden = !show; consent.disabled = !show; if (!show) { consent.checked = false; setError(consent, ''); } canada.hidden = country.value !== 'Canada'; } function isFreeDomain(v) { var domain = v.slice(v.lastIndexOf('@') + 1).trim().toLowerCase(); return FREE_DOMAINS.indexOf(domain) !== -1; } function emailError(v) { v = v.trim(); if (!v) return MSG_REQUIRED; if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v)) return MSG_EMAIL; return isFreeDomain(v) ? MSG_EMAIL : ''; } function showEmailError() { var p = emailWrap.querySelector('.cpd-email-error'); if (!p) { p = document.createElement('p'); p.className = 'error no-label cpd-email-error'; p.id = 'gv-dd-email-biz-err'; p.textContent = MSG_EMAIL; emailWrap.appendChild(p); } emailInput.setAttribute('aria-invalid', 'true'); emailInput.setAttribute('aria-describedby', 'gv-dd-email-err gv-dd-email-biz-err'); } function clearEmailError() { var p = emailWrap.querySelector('.cpd-email-error'); if (p) p.parentNode.removeChild(p); emailInput.setAttribute('aria-describedby', 'gv-dd-email-err'); if (root.querySelector('#gv-dd-email-err').hidden) emailInput.removeAttribute('aria-invalid'); refreshSummary(); } function fieldError(el) { if (el.name === 'email') return emailError(el.value); if (el.type === 'checkbox') return el.checked ? '' : MSG_REQUIRED; return el.value.trim() ? '' : MSG_REQUIRED; } function setError(el, msg) { if (el === emailInput) { if (msg === MSG_EMAIL) { showEmailError(); setFieldError(el, ''); el.setAttribute('aria-invalid', 'true'); return; } clearEmailError(); } setFieldError(el, msg); } function setFieldError(el, msg) { var p = root.querySelector('#' + el.id + '-err'); if (msg) { el.setAttribute('aria-invalid', 'true'); p.textContent = msg; p.hidden = false; } else { el.removeAttribute('aria-invalid'); p.textContent = ''; p.hidden = true; } refreshSummary(); } function shownError(el) { if (el === emailInput && emailWrap.querySelector('.cpd-email-error')) return MSG_EMAIL; var p = root.querySelector('#' + el.id + '-err'); return p && !p.hidden ? p.textContent : ''; } function summaryItem(el, msg) { var li = document.createElement('li'); li.setAttribute('data-for', el.id); var a = document.createElement('a'); a.href = '#' + el.id; a.textContent = labelFor(el); a.addEventListener('click', function (ev) { ev.preventDefault(); el.focus(); }); li.appendChild(a); li.appendChild(document.createTextNode(': ' + msg)); return li; } // After a submit, the summary mirrors the errors shown on the fields, in field order. function refreshSummary() { if (summary.hidden) return; var ul = summary.querySelector('ul'), prev = null, existing = {}; Array.prototype.forEach.call(ul.children, function (li) { existing[li.getAttribute('data-for')] = li; }); requiredFields().forEach(function (el) { var msg = shownError(el), li = existing[el.id]; delete existing[el.id]; if (!msg) { if (li) ul.removeChild(li); return; } if (!li) li = summaryItem(el, msg); else if (li.lastChild.nodeValue !== ': ' + msg) li.lastChild.nodeValue = ': ' + msg; var want = prev ? prev.nextSibling : ul.firstChild; if (li !== want) ul.insertBefore(li, want); prev = li; }); Object.keys(existing).forEach(function (k) { ul.removeChild(existing[k]); }); if (!ul.firstChild) summary.hidden = true; } function requiredFields() { var list = [form.elements.first_name, form.elements.last_name, form.elements.email, form.elements.company, country]; if (consentShown()) list.push(consent); return list; } function validateAll() { var errors = []; summary.hidden = true; requiredFields().forEach(function (el) { var msg = fieldError(el); setError(el, msg); touched[el.name] = true; if (msg) errors.push({ el: el, msg: msg }); }); var ul = summary.querySelector('ul'); ul.innerHTML = ''; errors.forEach(function (e) { ul.appendChild(summaryItem(e.el, e.msg)); }); summary.hidden = errors.length === 0; return errors.length === 0; } function readCookieParams() { var parts = document.cookie ? document.cookie.split('; ') : []; for (var i = 0; i < parts.length; i++) { var eq = parts[i].indexOf('='); if (parts[i].slice(0, eq) !== COOKIE_NAME) continue; try { var raw = parts[i].slice(eq + 1).replace(/(%[0-9A-Z]{2})+/g, decodeURIComponent); return new URL(raw).searchParams; } catch (e) { return null; } } return null; } function fillTracking() { var query = new URLSearchParams(window.location.search); var cookie = readCookieParams(); form.querySelectorAll('[data-gv-dd-track]').forEach(function (input) { if (input.value) return; var key = input.getAttribute('data-gv-dd-track'); if (CLICK_IDS_NEED_AD_CONSENT && CLICK_ID_KEYS.indexOf(key) !== -1 && !advertisingConsent()) return; var v = query.get(key) || (cookie && cookie.get(key)) || ''; if (!v && key === 'event_referral') v = window.location.pathname + window.location.search; input.value = v; }); } function focusables() { return Array.prototype.filter.call( panel.querySelectorAll('a[href], button, input, select, textarea, [tabindex]'), function (el) { return !el.disabled && el.tabIndex >= 0 && el.type !== 'hidden' && el.getClientRects().length > 0 && !el.closest('[hidden], .gv-dd-hp'); } ); } function syncViewport() { var vv = window.visualViewport; if (isOpen && vv && mobileMq.matches) { root.style.setProperty('--gv-dd-top', vv.offsetTop + 'px'); root.style.setProperty('--gv-dd-h', vv.height + 'px'); } else { root.style.removeProperty('--gv-dd-top'); root.style.removeProperty('--gv-dd-h'); } } function lockScroll() { var html = document.documentElement; var gap = window.innerWidth - html.clientWidth; html.classList.add('gv-dd-open'); if (gap > 0) document.body.style.paddingRight = gap + 'px'; } function unlockScroll() { document.documentElement.classList.remove('gv-dd-open'); document.body.style.paddingRight = ''; } function activeTitle() { return done.hidden ? title : doneText; } function open(fromEl) { if (isOpen) return true; clearTimeout(closeTimer); opener = fromEl || document.activeElement; if (!firstOpenedAt) firstOpenedAt = Date.now(); fillTracking(); isOpen = true; lockScroll(); root.hidden = false; syncViewport(); void root.offsetWidth; root.classList.add('is-open'); activeTitle().focus({ preventScroll: true }); return true; } function close() { if (!isOpen) return; isOpen = false; root.classList.remove('is-open'); unlockScroll(); syncViewport(); var hide = function () { if (!isOpen) root.hidden = true; }; if (reduceMq.matches) hide(); else closeTimer = setTimeout(hide, 220); if (opener && document.contains(opener) && typeof opener.focus === 'function') opener.focus({ preventScroll: true }); opener = null; } function showDone() { form.hidden = true; title.hidden = true; done.hidden = false; panel.setAttribute('aria-labelledby', 'gv-dd-done-text'); panel.removeAttribute('aria-describedby'); doneText.focus({ preventScroll: true }); } function showFail() { setBusy(false); fail.hidden = false; fail.focus(); } function setBusy(on) { pending = on; if (on) submitBtn.setAttribute('aria-disabled', 'true'); else submitBtn.removeAttribute('aria-disabled'); form.setAttribute('aria-busy', on ? 'true' : 'false'); } function pushLead() { if (!GV_PUSH_GENERATE_LEAD || leadPushed) return; leadPushed = true; var k = GV_SS_KEY; try { if (sessionStorage.getItem(k) === '1') return; sessionStorage.setItem(k, '1'); } catch (e) {} window.dataLayer = window.dataLayer || []; window.dataLayer.push({ event: 'generate_lead', type: GV_FORM_TYPE }); } // Qualified booker. Runs only after a confirmed Pardot success (fh=ok). Keys are Qualified's saveFormData names. // Consent prompt runs only when booker and consentPrompt are both true in the page config, // and only on www.copado.com, copado.com, and *.webflow.io. var GV_CONSENT_PROMPT = GV_BOOKER && C.consentPrompt === true && (function (h) { h = String(h || '').toLowerCase(); return h === 'www.copado.com' || h === 'copado.com' || /\.webflow\.io$/i.test(h); })(window.location.hostname); var GV_QUALIFIED_EXPERIENCE = typeof C.qualifiedExperience === 'string' ? C.qualifiedExperience : ''; var qualifiedSent = false; function sendToQualified() { if (!GV_BOOKER || !GV_QUALIFIED_EXPERIENCE || qualifiedSent || typeof window.qualified !== 'function') return; qualifiedSent = true; try { var val = function (n) { var el = form.elements[n]; var x = el && typeof el.value === 'string' ? el.value.trim() : ''; return x || undefined; }; window.qualified('saveFormData', { email: val('email'), company: val('company'), country: val('country'), gclid: val('GCLID'), msclkid: val('MSCLKID'), utm_campaign: val('utm_campaign'), utm_content: val('utm_content'), utm_medium: val('utm_medium'), utm_source: val('utm_source'), utm_term: val('utm_term') }); window.qualified('emitFormFill', 'custom'); window.qualified('showFormExperience', GV_QUALIFIED_EXPERIENCE); } catch (err) {} } // Post-submit wording. Static markup default is 'details', so a script failure still shows approved text. // 'booked' is shown only on Qualified's "Meeting Booked" event after this drawer's own confirmed submit. // 'consent' line chosen by Robbie from Copy drafts. Used only when GV_CONSENT_PROMPT is true (www / apex / webflow.io). var GV_DONE = { loading: 'Thanks, one moment while we load your meeting booking.', booked: "You're booked. You'll get the meeting invite by email, and someone from the Copado team will be in touch.", details: 'Thanks, we have your details and someone from the Copado team will be in touch to arrange a time.', consent: 'Thanks, we have your details. To choose a time for your meeting, please allow cookies for the booking calendar.' }; var GV_FRAME_ID = 'q-messenger-frame', GV_FULL_CLASS = 'qlfd-full-screen'; var GV_OPEN_WAIT_MS = 15000, GV_SETTLE_MS = 1500; var drawerSubmitted = false, doneState = 'details', bookerWatch = false, bookerOpened = false; var openTimer = null, settleTimer = null, frameObs = null, bodyObs = null, bookingListener = false; var cookieConsentArmed = false, readyTimer = null, readyAttempts = 0; function showConsentActions(on) { if (!consentActions) return; consentActions.hidden = !on; } function setDoneState(s) { if (!GV_DONE[s] || doneState === 'booked' || doneState === s) return; doneState = s; doneText.textContent = GV_DONE[s]; showConsentActions(s === 'consent'); } function stopWatch() { bookerWatch = false; clearTimeout(openTimer); clearTimeout(settleTimer); clearTimeout(readyTimer); try { if (frameObs) frameObs.disconnect(); } catch (err) {} try { if (bodyObs) bodyObs.disconnect(); } catch (err) {} frameObs = null; bodyObs = null; } function settleDetails() { if (doneState === 'loading') setDoneState('details'); stopWatch(); } function onFrameClass(f) { if (!bookerWatch) return; var full = f.classList.contains(GV_FULL_CLASS); if (full) { bookerOpened = true; clearTimeout(openTimer); clearTimeout(settleTimer); } else if (bookerOpened) { clearTimeout(settleTimer); settleTimer = setTimeout(settleDetails, GV_SETTLE_MS); } } function watchFrame(f) { if (!bookerWatch) return; frameObs = new MutationObserver(function () { onFrameClass(f); }); frameObs.observe(f, { attributes: true, attributeFilter: ['class'] }); if (f.classList.contains(GV_FULL_CLASS)) onFrameClass(f); } function startBookerWatch() { stopWatch(); bookerWatch = true; bookerOpened = false; setDoneState('loading'); openTimer = setTimeout(function () { if (!bookerOpened) settleDetails(); }, GV_OPEN_WAIT_MS); try { if (typeof MutationObserver !== 'function') return; var f = document.getElementById(GV_FRAME_ID); if (f) { watchFrame(f); return; } bodyObs = new MutationObserver(function () { var g = document.getElementById(GV_FRAME_ID); if (!g || !bodyObs) return; bodyObs.disconnect(); bodyObs = null; watchFrame(g); }); bodyObs.observe(document.body, { childList: true }); } catch (err) {} } function onQualifiedEvent(name) { if (name !== 'Meeting Booked' || !drawerSubmitted || !qualifiedSent) return; setDoneState('booked'); stopWatch(); } function registerBookingListener() { if (!GV_BOOKER || bookingListener || typeof window.qualified !== 'function') return; try { window.qualified('handleEvents', onQualifiedEvent); bookingListener = true; } catch (err) {} } registerBookingListener(); function advertisingConsent() { try { if (window.__GV_FORCE_ADVERTISING_CONSENT__ === true) return true; if (window.__GV_FORCE_ADVERTISING_CONSENT__ === false) return false; if (!window.Termly || typeof Termly.getConsentState !== 'function') return false; var state = Termly.getConsentState(); return !!(state && state.advertising === true); } catch (err) { return false; } } function openPreferenceCenter(e) { if (e && e.preventDefault) e.preventDefault(); try { if (typeof window.displayPreferenceModal === 'function') { window.displayPreferenceModal(); return; } var footer = document.querySelector('footer a.termly-display-preferences, a.termly-display-preferences'); if (footer) { footer.click(); return; } } catch (err) {} } function qualifiedLibraryReady() { try { if (window.__GV_QUALIFIED_READY__ === true) return true; if (window.__GV_QUALIFIED_READY__ === false) return false; var scripts = document.querySelectorAll('script[src*="js.qualified.com"]'); var i, t, blocked = false, allowed = false; for (i = 0; i < scripts.length; i++) { t = (scripts[i].getAttribute('type') || 'text/javascript').toLowerCase(); if (t.indexOf('plain') !== -1) blocked = true; else allowed = true; } if (blocked && !allowed) return false; if (allowed) return true; } catch (err) {} // No script tag found: only treat as ready when advertising is already true // and a non-stub signal exists (harness sets __GV_QUALIFIED_READY__). return false; } function offerBooker() { if (!drawerSubmitted || qualifiedSent) return; registerBookingListener(); startBookerWatch(); sendToQualified(); if (!qualifiedSent) { setDoneState('details'); stopWatch(); } } function waitForQualifiedReady(doneFn) { readyAttempts = 0; clearTimeout(readyTimer); function tick() { if (qualifiedSent || doneState === 'booked') return; if (qualifiedLibraryReady()) { doneFn(); return; } readyAttempts += 1; if (readyAttempts > 40) { // ~12s setDoneState('details'); stopWatch(); return; } readyTimer = setTimeout(tick, 300); } setDoneState('loading'); tick(); } function onCookieConsentChange() { if (!drawerSubmitted || doneState === 'booked' || qualifiedSent) return; if (advertisingConsent()) { waitForQualifiedReady(offerBooker); } else if (doneState === 'consent') { setDoneState('details'); stopWatch(); } } function armCookieConsentListener() { if (cookieConsentArmed) return; cookieConsentArmed = true; try { if (window.Termly && typeof Termly.on === 'function') { Termly.on('consent', onCookieConsentChange); Termly.on('initialized', onCookieConsentChange); } } catch (err) {} // Harness / late Termly: also listen for a custom event try { window.addEventListener('gv-termly-consent', onCookieConsentChange); } catch (err2) {} } if (openPrefsBtn) { openPrefsBtn.addEventListener('click', openPreferenceCenter); } function finish(result) { if (!pending) return; clearTimeout(resultTimer); clearTimeout(graceTimer); if (result === 'ok') { setBusy(false); pushLead(); drawerSubmitted = true; showDone(); if (!GV_BOOKER) { setDoneState('details'); return; } registerBookingListener(); if (GV_CONSENT_PROMPT && !advertisingConsent()) { // www / apex / webflow.io: consent prompt (wording chosen by Robbie). setDoneState('consent'); armCookieConsentListener(); } else { // Other hostnames, or consent already given: unchanged 2026-11-02-three-state path. startBookerWatch(); sendToQualified(); if (!qualifiedSent) { setDoneState('details'); stopWatch(); } } } else showFail(); } frame.addEventListener('load', function () { if (!pending) return; var r = cfg.readResult(frame); if (r === 'ok' || r === 'err') { finish(r); return; } if (r === 'blank') return; clearTimeout(graceTimer); graceTimer = setTimeout(function () { finish('unknown'); }, cfg.graceMs); }); form.addEventListener('submit', function (e) { if (pending) { e.preventDefault(); return; } fail.hidden = true; if (form.elements.pardot_extra_field.value) { e.preventDefault(); showDone(); setDoneState('details'); return; } if (!validateAll()) { e.preventDefault(); if (emailWrap.querySelector('.cpd-email-error')) emailInput.focus(); else summary.focus(); return; } if (Date.now() - firstOpenedAt < cfg.minFillMs) { e.preventDefault(); showDone(); setDoneState('details'); return; } fillTracking(); form.elements.consent_timestamp.value = new Date().toISOString(); form.elements.consent_text_version.value = consentShown() ? '2026-08-v2-consent' : '2026-08-v2-notice'; form.elements.consent_source_url.value = window.location.href; if (!cfg.postEmptyTracking) { var emptied = []; form.querySelectorAll('[data-gv-dd-track]').forEach(function (input) { if (!input.value) { input.disabled = true; emptied.push(input); } }); setTimeout(function () { emptied.forEach(function (input) { input.disabled = false; }); }, 0); } setBusy(true); resultTimer = setTimeout(function () { finish('timeout'); }, cfg.timeoutMs); }); country.addEventListener('change', function () { updateCountry(); if (touched.country) setError(country, fieldError(country)); }); emailInput.addEventListener('blur', function () { if (!emailInput.value.trim() && !touched.email) return; touched.email = true; setError(emailInput, emailError(emailInput.value)); }); emailInput.addEventListener('input', function () { if (emailWrap.querySelector('.cpd-email-error') && !isFreeDomain(emailInput.value)) clearEmailError(); if (emailInput.value.trim()) setFieldError(emailInput, ''); if (emailWrap.querySelector('.cpd-email-error')) emailInput.setAttribute('aria-invalid', 'true'); }); form.addEventListener('input', function (e) { var el = e.target; if (el === emailInput || !touched[el.name] || el.type === 'hidden' || el.name === 'pardot_extra_field') return; if (el.getAttribute('aria-invalid') === 'true' && !fieldError(el)) setError(el, ''); }); form.addEventListener('change', function (e) { if (e.target === consent && touched.marketing_consent) setError(consent, fieldError(consent)); }); root.addEventListener('click', function (e) { if (e.target.closest('[data-gv-dd-close]')) close(); }); document.addEventListener('keydown', function (e) { if (!isOpen) return; if (e.key === 'Escape' || e.key === 'Esc') { e.preventDefault(); close(); return; } if (e.key !== 'Tab') return; e.preventDefault(); var f = focusables(); if (!f.length) return; var a = document.activeElement, i = f.indexOf(a), next; if (i !== -1) { next = f[(i + (e.shiftKey ? f.length - 1 : 1)) % f.length]; } else { var after = f.filter(function (el) { return a.compareDocumentPosition(el) & Node.DOCUMENT_POSITION_FOLLOWING; }); var before = f.filter(function (el) { return a.compareDocumentPosition(el) & Node.DOCUMENT_POSITION_PRECEDING; }); next = e.shiftKey ? (before[before.length - 1] || f[f.length - 1]) : (after[0] || f[0]); } next.focus(); }); document.addEventListener('focusin', function (e) { if (isOpen && !panel.contains(e.target)) activeTitle().focus({ preventScroll: true }); }); if (window.visualViewport) { window.visualViewport.addEventListener('resize', syncViewport); window.visualViewport.addEventListener('scroll', syncViewport); } if (mobileMq.addEventListener) mobileMq.addEventListener('change', syncViewport); window.GVDemoDrawer = { open: open, close: close, version: 'generic-2026-11-03-cicd', booker: GV_BOOKER, consentPrompt: GV_CONSENT_PROMPT }; })(); (function () { 'use strict'; var C = window.GV_DRAWER_CONFIG; if (!C || !(C.pathRe instanceof RegExp) || !C.pathRe.test(window.location.pathname)) return; var SELECTOR = typeof C.ctaSelector === 'string' && C.ctaSelector ? C.ctaSelector : 'a[data-demo-drawer]'; function isDemoLink(a) { try { var u = new URL(a.href, window.location.href); return u.hostname === 'www.copado.com' && /^\/demo\/?$/.test(u.pathname); } catch (err) { return false; } } // Window, bubble phase: GTM's document-level click listeners see the click first and unchanged. // No stopPropagation. If the drawer is missing or throws, the link navigates to /demo as normal. window.addEventListener('click', function (e) { if (e.defaultPrevented || e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return; var link = e.target && e.target.closest ? e.target.closest(SELECTOR) : null; if (!link || !isDemoLink(link)) return; var drawer = window.GVDemoDrawer; if (!drawer || typeof drawer.open !== 'function') return; var opened = false; try { opened = drawer.open(link) === true; } catch (err) { opened = false; } if (opened) e.preventDefault(); }, false); })(); })();