1window.cfields = []; 2window._show_thank_you = function(id, message, trackcmp_url, email) { 3 var form = document.getElementById('_form_' + id + '_'), thank_you = form.querySelector('._form-thank-you'); 4 form.querySelector('._form-content').style.display = 'none'; 5 thank_you.innerHTML = message; 6 thank_you.style.display = 'block'; 7 const vgoAlias = typeof visitorGlobalObjectAlias === 'undefined' ? 'vgo' : visitorGlobalObjectAlias; 8 var visitorObject = window[vgoAlias]; 9 if (email && typeof visitorObject !== 'undefined') { 10 visitorObject('setEmail', email); 11 visitorObject('update'); 12 } else if (typeof(trackcmp_url) != 'undefined' && trackcmp_url) { 13 // Site tracking URL to use after inline form submission. 14 _load_script(trackcmp_url); 15 } 16 if (typeof window._form_callback !== 'undefined') window._form_callback(id); 17}; 18window._show_error = function(id, message, html) { 19 var form = document.getElementById('_form_' + id + '_'), 20 err = document.createElement('div'), 21 button = form.querySelector('button'), 22 old_error = form.querySelector('._form_error'); 23 if (old_error) old_error.parentNode.removeChild(old_error); 24 err.innerHTML = message; 25 err.className = '_error-inner _form_error _no_arrow'; 26 var wrapper = document.createElement('div'); 27 wrapper.className = '_form-inner'; 28 wrapper.appendChild(err); 29 button.parentNode.insertBefore(wrapper, button); 30 var submitButton = form.querySelector('[id^="_form"][id$="_submit"]'); 31 submitButton.disabled = false; 32 submitButton.classList.remove('processing'); 33 if (html) { 34 var div = document.createElement('div'); 35 div.className = '_error-html'; 36 div.innerHTML = html; 37 err.appendChild(div); 38 } 39}; 40window._load_script = function(url, callback, isSubmit) { 41 var head = document.querySelector('head'), script = document.createElement('script'), r = false; 42 var submitButton = document.querySelector('#_form_365_submit'); 43 script.type = 'text/javascript'; 44 script.charset = 'utf-8'; 45 script.src = url; 46 if (callback) { 47 script.onload = script.onreadystatechange = function() { 48 if (!r && (!this.readyState || this.readyState == 'complete')) { 49 r = true; 50 callback(); 51 } 52 }; 53 } 54 script.onerror = function() { 55 if (isSubmit) { 56 if (script.src.length > 10000) { 57 _show_error("365", "Sorry, your submission failed. Please shorten your responses and try again."); 58 } else { 59 _show_error("365", "Sorry, your submission failed. Please try again."); 60 } 61 submitButton.disabled = false; 62 submitButton.classList.remove('processing'); 63 } 64 } 65 66 head.appendChild(script); 67}; 68(function() { 69 if (window.location.search.search("excludeform") !== -1) return false; 70 var getCookie = function(name) { 71 var match = document.cookie.match(new RegExp('(^|; )' + name + '=([^;]+)')); 72 return match ? match[2] : null; 73 } 74 var setCookie = function(name, value) { 75 var now = new Date(); 76 var time = now.getTime(); 77 var expireTime = time + 1000 * 60 * 60 * 24 * 365; 78 now.setTime(expireTime); 79 document.cookie = name + '=' + value + '; expires=' + now + ';path=/; Secure; SameSite=Lax;'; 80 } 81 var addEvent = function(element, event, func) { 82 if (element.addEventListener) { 83 element.addEventListener(event, func); 84 } else { 85 var oldFunc = element['on' + event]; 86 element['on' + event] = function() { 87 oldFunc.apply(this, arguments); 88 func.apply(this, arguments); 89 }; 90 } 91 } 92 var _removed = false; 93 var form_to_submit = document.getElementById('_form_365_'); 94 var allInputs = form_to_submit.querySelectorAll('input, select, textarea'), tooltips = [], submitted = false; 95 96 var getUrlParam = function(name) { 97 var params = new URLSearchParams(window.location.search); 98 return params.get(name) || false; 99 }; 100 101 var acctDateFormat = "%d/%B/%Y"; 102 var getNormalizedDate = function(date, acctFormat) { 103 var decodedDate = decodeURIComponent(date); 104 if (Date.parse(decodedDate)) { 105 var dateObj = new Date(decodedDate); 106 var year = dateObj.getFullYear();
107 var month = dateObj.getMonth() + 1; 108 var day = dateObj.getDate(); 109 return `${year}-${month < 10 ? `0${month}` : month}-${day < 10 ? `0${day}` : day}`; 110 } else if (acctFormat.match(/(%d|%e).*%m/gm) !== null) { 111 return decodedDate.replace(/(\d{1,2}).*(\d{1,2}).*(\d{4})/gm, '$3-$1-$2'); 112 } 113 return false; 114 }; 115 116 var getNormalizedTime = function(time) { 117 var hour, minutes; 118 var decodedTime = decodeURIComponent(time); 119 var timeParts = Array.from(decodedTime.matchAll(/(\d{1,2}):(\d{1,2})\W*([AaPp][Mm])?/gm))[0]; 120 if (timeParts[3]) { // 12 hour format 121 var isPM = timeParts[3].toLowerCase() === 'pm'; 122 if (isPM) { 123 hour = parseInt(timeParts[1]) === 12 ? '12' : `${parseInt(timeParts[1]) + 12}`; 124 } else { 125 hour = parseInt(timeParts[1]) === 12 ? '0' : timeParts[1]; 126 } 127 } else { // 24 hour format 128 hour = timeParts[1]; 129 } 130 var normalizedHour = parseInt(hour) < 10 ? `0${hour}` : hour; 131 var minutes = timeParts[2]; 132 return `${normalizedHour}:${minutes}`; 133 }; 134 135 for (var i = 0; i < allInputs.length; i++) { 136 var regexStr = "field\\[(\\d+)\\]"; 137 var results = new RegExp(regexStr).exec(allInputs[i].name); 138 if (results != undefined) { 139 allInputs[i].dataset.name = allInputs[i].name.match(/\[time\]$/) 140 ? `${window.cfields[results[1]]}_time` 141 : window.cfields[results[1]]; 142 } else { 143 allInputs[i].dataset.name = allInputs[i].name; 144 } 145 var fieldVal = getUrlParam(allInputs[i].dataset.name); 146 147 if (fieldVal) { 148 if (allInputs[i].dataset.autofill === "false") { 149 continue; 150 } 151 if (allInputs[i].type == "radio" || allInputs[i].type == "checkbox") { 152 if (allInputs[i].value == fieldVal) { 153 allInputs[i].checked = true; 154 } 155 } else if (allInputs[i].type == "date") { 156 allInputs[i].value = getNormalizedDate(fieldVal, acctDateFormat); 157 } else if (allInputs[i].type == "time") { 158 allInputs[i].value = getNormalizedTime(fieldVal); 159 } else { 160 allInputs[i].value = fieldVal; 161 } 162 } 163 } 164 165 var remove_tooltips = function() { 166 for (var i = 0; i < tooltips.length; i++) { 167 tooltips[i].tip.parentNode.removeChild(tooltips[i].tip); 168 } 169 tooltips = []; 170 }; 171 var remove_tooltip = function(elem) { 172 for (var i = 0; i < tooltips.length; i++) { 173 if (tooltips[i].elem === elem) { 174 tooltips[i].tip.parentNode.removeChild(tooltips[i].tip); 175 tooltips.splice(i, 1); 176 return; 177 } 178 } 179 }; 180 var create_tooltip = function(elem, text) { 181 var tooltip = document.createElement('div'), 182 arrow = document.createElement('div'), 183 inner = document.createElement('div'), new_tooltip = {}; 184 if (elem.type != 'radio' && elem.type != 'checkbox') { 185 tooltip.className = '_error'; 186 arrow.className = '_error-arrow'; 187 inner.className = '_error-inner'; 188 inner.innerHTML = text; 189 tooltip.appendChild(arrow); 190 tooltip.appendChild(inner); 191 elem.parentNode.appendChild(tooltip); 192 } else { 193 tooltip.className = '_error-inner _no_arrow'; 194 tooltip.innerHTML = text; 195 elem.parentNode.insertBefore(tooltip, elem); 196 new_tooltip.no_arrow = true; 197 } 198 new_tooltip.tip = tooltip; 199 new_tooltip.elem = elem; 200 tooltips.push(new_tooltip); 201 return new_tooltip; 202 }; 203 var resize_tooltip = function(tooltip) { 204 var rect = tooltip.elem.getBoundingClientRect(); 205 var doc = document.documentElement, 206 scrollPosition = rect.top - ((window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0)); 207 if (scrollPosition < 40) { 208 tooltip.tip.className = tooltip.tip.className.replace(/ ?(_above|_below) ?/g, '') + ' _below'; 209 } else { 210 tooltip.tip.className = tooltip.tip.className.replace(/ ?(_above|_below) ?/g, '') + ' _above'; 211 } 212 }; 213 var resize_tooltips = function() { 214 if (_removed) return; 215 for (var i = 0; i < tooltips.length; i++) { 216 if (!tooltips[i].no_arrow) resize_tooltip(tooltips[i]); 217 } 218 };
219 var validate_field = function(elem, remove) { 220 var tooltip = null, value = elem.value, no_error = true; 221 remove ? remove_tooltip(elem) : false; 222 if (elem.type != 'checkbox') elem.className = elem.className.replace(/ ?_has_error ?/g, ''); 223 if (elem.getAttribute('required') !== null) { 224 if (elem.type == 'radio' || (elem.type == 'checkbox' && /any/.test(elem.className))) { 225 var elems = form_to_submit.elements[elem.name]; 226 if (!(elems instanceof NodeList || elems instanceof HTMLCollection) || elems.length <= 1) { 227 no_error = elem.checked; 228 } 229 else { 230 no_error = false; 231 for (var i = 0; i < elems.length; i++) { 232 if (elems[i].checked) no_error = true; 233 } 234 } 235 if (!no_error) { 236 tooltip = create_tooltip(elem, "Please select an option."); 237 } 238 } else if (elem.type =='checkbox') { 239 var elems = form_to_submit.elements[elem.name], found = false, err = []; 240 no_error = true; 241 for (var i = 0; i < elems.length; i++) { 242 if (elems[i].getAttribute('required') === null) continue; 243 if (!found && elems[i] !== elem) return true; 244 found = true; 245 elems[i].className = elems[i].className.replace(/ ?_has_error ?/g, ''); 246 if (!elems[i].checked) { 247 no_error = false; 248 elems[i].className = elems[i].className + ' _has_error'; 249 err.push("Checking %s is required".replace("%s", elems[i].value)); 250 } 251 } 252 if (!no_error) { 253 tooltip = create_tooltip(elem, err.join('<br/>')); 254 } 255 } else if (elem.tagName == 'SELECT') { 256 var selected = true; 257 if (elem.multiple) { 258 selected = false; 259 for (var i = 0; i < elem.options.length; i++) { 260 if (elem.options[i].selected) { 261 selected = true; 262 break; 263 } 264 } 265 } else { 266 for (var i = 0; i < elem.options.length; i++) { 267 if (elem.options[i].selected 268 && (!elem.options[i].value 269 || (elem.options[i].value.match(/\n/g))) 270 ) { 271 selected = false; 272 } 273 } 274 } 275 if (!selected) { 276 elem.className = elem.className + ' _has_error'; 277 no_error = false; 278 tooltip = create_tooltip(elem, "Please select an option."); 279 } 280 } else if (value === undefined || value === null || value === '') { 281 elem.className = elem.className + ' _has_error'; 282 no_error = false; 283 tooltip = create_tooltip(elem, "This field is required."); 284 } 285 } 286 if (no_error && (elem.id == 'field[]' || elem.id == 'ca[11][v]')) { 287 if (elem.className.includes('phone-input-error')) { 288 elem.className = elem.className + ' _has_error'; 289 no_error = false; 290 } 291 } 292 if (no_error && elem.name == 'email') { 293 if (!value.match(/^[\+_a-z0-9-'&=]+(\.[\+_a-z0-9-']+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,})$/i)) { 294 elem.className = elem.className + ' _has_error'; 295 no_error = false; 296 tooltip = create_tooltip(elem, "Enter a valid email address."); 297 } 298 } 299 if (no_error && /date_field/.test(elem.className)) { 300 if (!value.match(/^\d\d\d\d-\d\d-\d\d$/)) { 301 elem.className = elem.className + ' _has_error'; 302 no_error = false; 303 tooltip = create_tooltip(elem, "Enter a valid date."); 304 } 305 } 306 tooltip ? resize_tooltip(tooltip) : false; 307 return no_error; 308 }; 309 var needs_validate = function(el) { 310 if(el.getAttribute('required') !== null){ 311 return true 312 } 313 if(el.name === 'email' && el.value !== ""){ 314 return true 315 } 316 317 if((el.id == 'field[]' || el.id == 'ca[11][v]') && el.className.includes('phone-input-error')){ 318 return true 319 } 320 321 return false 322 };
323 var validate_form = function(e) { 324 var err = form_to_submit.querySelector('._form_error'), no_error = true; 325 if (!submitted) { 326 submitted = true; 327 for (var i = 0, len = allInputs.length; i < len; i++) { 328 var input = allInputs[i]; 329 if (needs_validate(input)) { 330 if (input.type == 'tel') { 331 addEvent(input, 'blur', function() { 332 this.value = this.value.trim(); 333 validate_field(this, true); 334 }); 335 } 336 if (input.type == 'text' || input.type == 'number' || input.type == 'time') { 337 addEvent(input, 'blur', function() { 338 this.value = this.value.trim(); 339 validate_field(this, true); 340 }); 341 addEvent(input, 'input', function() { 342 validate_field(this, true); 343 }); 344 } else if (input.type == 'radio' || input.type == 'checkbox') { 345 (function(el) { 346 var radios = form_to_submit.elements[el.name]; 347 for (var i = 0; i < radios.length; i++) { 348 addEvent(radios[i], 'click', function() { 349 validate_field(el, true); 350 }); 351 } 352 })(input); 353 } else if (input.tagName == 'SELECT') { 354 addEvent(input, 'change', function() { 355 validate_field(this, true); 356 }); 357 } else if (input.type == 'textarea'){ 358 addEvent(input, 'input', function() { 359 validate_field(this, true); 360 }); 361 } 362 } 363 } 364 } 365 remove_tooltips(); 366 for (var i = 0, len = allInputs.length; i < len; i++) { 367 var elem = allInputs[i]; 368 if (needs_validate(elem)) { 369 if (elem.tagName.toLowerCase() !== "select") { 370 elem.value = elem.value.trim(); 371 } 372 validate_field(elem) ? true : no_error = false; 373 } 374 } 375 if (!no_error && e) { 376 e.preventDefault(); 377 } 378 resize_tooltips(); 379 return no_error; 380 }; 381 addEvent(window, 'resize', resize_tooltips); 382 addEvent(window, 'scroll', resize_tooltips); 383 384 var hidePhoneInputError = function(inputId) { 385 var errorMessage = document.getElementById("error-msg-" + inputId); 386 var input = document.getElementById(inputId); 387 errorMessage.classList.remove("phone-error"); 388 errorMessage.classList.add("phone-error-hidden"); 389 input.classList.remove("phone-input-error"); 390 }; 391 392 var initializePhoneInput = function(input, defaultCountry) { 393 return window.intlTelInput(input, { 394 utilsScript: "https://unpkg.com/[email protected]/build/js/utils.js", 395 autoHideDialCode: false, 396 separateDialCode: true, 397 initialCountry: defaultCountry, 398 preferredCountries: [] 399 }); 400 } 401 402 var setPhoneInputEventListeners = function(inputId, input, iti) { 403 input.addEventListener('blur', function() { 404 var errorMessage = document.getElementById("error-msg-" + inputId); 405 if (input.value.trim()) { 406 if (iti.isValidNumber()) { 407 iti.setNumber(iti.getNumber()); 408 if (errorMessage.classList.contains("phone-error")){ 409 hidePhoneInputError(inputId); 410 } 411 } else { 412 showPhoneInputError(inputId) 413 } 414 } else { 415 if (errorMessage.classList.contains("phone-error")){ 416 hidePhoneInputError(inputId); 417 } 418 } 419 }); 420 421 input.addEventListener("countrychange", function() { 422 iti.setNumber(''); 423 }); 424 425 input.addEventListener("keydown", function(e) {
426 var charCode = (e.which) ? e.which : e.keyCode; 427 if (charCode > 31 && (charCode < 48 || charCode > 57) && charCode !== 8) { 428 e.preventDefault(); 429 } 430 }); 431 }; 432 433 var showPhoneInputError = function(inputId) { 434 var errorMessage = document.getElementById("error-msg-" + inputId); 435 var input = document.getElementById(inputId); 436 errorMessage.classList.add("phone-error"); 437 errorMessage.classList.remove("phone-error-hidden"); 438 input.classList.add("phone-input-error"); 439 }; 440 441 442 window['recaptcha_callback'] = function() { 443 // Get all recaptchas in the DOM (there may be more than one form on the page). 444 var recaptchas = document.getElementsByClassName("g-recaptcha"); 445 for (var i in recaptchas) { 446 // Set the recaptcha element ID, so the recaptcha can be applied to each element. 447 var recaptcha_id = "recaptcha_" + i; 448 recaptchas[i].id = recaptcha_id; 449 var el = document.getElementById(recaptcha_id); 450 if (el != null) { 451 var sitekey = el.getAttribute("data-sitekey"); 452 var stoken = el.getAttribute("data-stoken"); 453 try{ 454 grecaptcha.render(recaptcha_id, {"sitekey":sitekey,"stoken":stoken}); 455 } 456 catch(e){ 457 458 } 459 } 460 } 461}; _load_script( 462 "https://www.google.com/recaptcha/api.js?onload=recaptcha_callback&render=explicit" 463 ); 464 var _form_serialize = function(form){if(!form||form.nodeName!=="FORM"){return }var i,j,q=[];for(i=0;i<form.elements.length;i++){if(form.elements[i].name===""){continue}switch(form.elements[i].nodeName){case"INPUT":switch(form.elements[i].type){case"tel":q.push(form.elements[i].name+"="+encodeURIComponent(form.elements[i].previousSibling.querySelector('div.iti__selected-dial-code').innerText)+encodeURIComponent(" ")+encodeURIComponent(form.elements[i].value));break;case"text":case"number":case"date":case"time":case"hidden":case"password":case"button":case"reset":case"submit":q.push(form.elements[i].name+"="+encodeURIComponent(form.elements[i].value));break;case"checkbox":case"radio":if(form.elements[i].checked){q.push(form.elements[i].name+"="+encodeURIComponent(form.elements[i].value))}break;case"file":break}break;case"TEXTAREA":q.push(form.elements[i].name+"="+encodeURIComponent(form.elements[i].value));break;case"SELECT":switch(form.elements[i].type){case"select-one":q.push(form.elements[i].name+"="+encodeURIComponent(form.elements[i].value));break;case"select-multiple":for(j=0;j<form.elements[i].options.length;j++){if(form.elements[i].options[j].selected){q.push(form.elements[i].name+"="+encodeURIComponent(form.elements[i].options[j].value))}}break}break;case"BUTTON":switch(form.elements[i].type){case"reset":case"submit":case"button":q.push(form.elements[i].name+"="+encodeURIComponent(form.elements[i].value));break}break}}return q.join("&")}; 465 var form_submit = function(e) { 466 e.preventDefault(); 467 if (validate_form()) { 468 // use this trick to get the submit button & disable it using plain
468javascript 469 var submitButton = e.target.querySelector('#_form_365_submit'); 470 submitButton.disabled = true; 471 submitButton.classList.add('processing'); 472 var serialized = _form_serialize( 473 document.getElementById('_form_365_') 474 ).replace(/%0A/g, '\\n'); 475 var err = form_to_submit.querySelector('._form_error'); 476 err ? err.parentNode.removeChild(err) : false; 477 _load_script('//ac.strategic.ae/proc.php?' + serialized + '&jsonp=true', null, true); 478 } 479 return false; 480 }; 481 addEvent(form_to_submit, 'submit', form_submit); 482})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.