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