Reports & Publications

Grass, Plant, Path
Advertisement, Adult, Female
Water, Waterfront, Harbor
#mc_embed_signup{background:#fff; clear:left; font:14px Helvetica,Arial,sans-serif; width: 600px;}

Subscribe

* indicates required
Privacy Policy *
(function($) { window.fnames = new Array(); window.ftypes = new Array(); fnames[0]=’EMAIL’;ftypes[0]=’email’; fnames[7]=’MMERGE7′;ftypes[7]=’radio’; fnames[1]=’FNAME’;ftypes[1]=’text’; fnames[2]=’LNAME’;ftypes[2]=’text’; fnames[3]=’ADDRESS’;ftypes[3]=’address’; fnames[4]=’PHONE’;ftypes[4]=’phone’; fnames[5]=’BIRTHDAY’;ftypes[5]=’birthday’; fnames[6]=’COMPANY’;ftypes[6]=’text’; }(jQuery)); var $mcj = jQuery.noConflict(true); if(!window.MC) { window.MC = {}; } window.MC.smsPhoneData = { defaultCountryCode: ‘SG’, programs: [], smsProgramDataCountryNames: [] }; function getCountryUnicodeFlag(countryCode) { return countryCode.toUpperCase().replace(/./g, (char) => String.fromCodePoint(char.charCodeAt(0) + 127397)) }; function sanitizeHtml(str) { if (typeof str !== ‘string’) return ”; return str .replace(/&/g, ‘&’) .replace(//g, ‘>’) .replace(/”/g, ‘"’) .replace(/’/g, ‘'’) .replace(/\//g, ‘/’); } function sanitizeUrl(url) { if (typeof url !== ‘string’) return ”; const trimmedUrl = url.trim().toLowerCase(); if (trimmedUrl.startsWith(‘javascript:’)) return ‘#’; if (trimmedUrl.startsWith(‘data:’)) return ‘#’; if (trimmedUrl.startsWith(‘vbscript:’)) return ‘#’; return url; } const getBrowserLanguage = () => { if (window) { if (window.navigator) { if (window.navigator.language) { var parts = window.navigator.language.split(‘-‘); if (!parts[1]) { return window.navigator.language.toUpperCase(); } return parts[1]; } } } return null; }; function getDefaultCountryProgram(defaultCountryCode, smsProgramData) { if (!smsProgramData) return null; if (smsProgramData.length === 0) return null; const browserLanguage = getBrowserLanguage(); if (browserLanguage) { const foundProgram = smsProgramData.find(function(program){ return program.countryCode === browserLanguage; }); if (foundProgram) { return foundProgram; } } if (defaultCountryCode) { const foundProgram = smsProgramData.find(function(program){ return program.countryCode === defaultCountryCode; }); if (foundProgram) { return foundProgram; } } return smsProgramData[0]; } function updateSmsLegalText(countryCode, fieldName) { if (!countryCode) return; if (!fieldName) return; const programs = window.MC.smsPhoneData.programs; if (!programs) return; if (!Array.isArray(programs)) return; const program = programs.find(function(program){ return program.countryCode === countryCode; }); if (!program) return; if (!program.requiredTemplate) return; const legalTextElement = document.querySelector(‘#legal-text-‘ + fieldName); if (!legalTextElement) return; const divRegex = new RegExp(‘]*>’, ‘gi’); const template = program.requiredTemplate.replace(divRegex, ”); legalTextElement.textContent = ”; const parts = template.split(/(.*?)/g); parts.forEach(function(part) { if (!part) return; const anchorMatch = part.match(/(.*?)/); if (anchorMatch) { const linkElement = document.createElement(‘a’); linkElement.href = sanitizeUrl(anchorMatch[1]); linkElement.target = sanitizeHtml(anchorMatch[2]); linkElement.textContent = sanitizeHtml(anchorMatch[3]); legalTextElement.appendChild(linkElement); } else { legalTextElement.appendChild(document.createTextNode(part)); } }); } function generateDropdownOptions(smsProgramData) { if (!smsProgramData) return ”; if (smsProgramData.length === 0) return ”; return smsProgramData.map(function(program) { const flag = getCountryUnicodeFlag(program.countryCode); const countryName = getCountryName(program.countryCode); const callingCode = program.countryCallingCode || ”; const sanitizedCountryCode = sanitizeHtml(program.countryCode || ”); const sanitizedCountryName = sanitizeHtml(countryName || ”); const sanitizedCallingCode = sanitizeHtml(callingCode || ”); return ‘‘; }).join(”); } function getCountryName(countryCode) { if (window.MC.smsPhoneData.smsProgramDataCountryNames) { if (Array.isArray(window.MC.smsPhoneData.smsProgramDataCountryNames)) { for (let i = 0; i < window.MC.smsPhoneData.smsProgramDataCountryNames.length; i++) { if (window.MC.smsPhoneData.smsProgramDataCountryNames[i].code === countryCode) { return window.MC.smsPhoneData.smsProgramDataCountryNames[i].name; } } } } return countryCode; } function getDefaultPlaceholder(countryCode) { if (!countryCode) return '+1 000 000 0000'; if (typeof countryCode !== 'string') return '+1 000 000 0000'; var mockPlaceholders = [ { countryCode: 'US', placeholder: '+1 000 000 0000' }, { countryCode: 'GB', placeholder: '+44 0000 000000' }, { countryCode: 'CA', placeholder: '+1 000 000 0000' }, { countryCode: 'AU', placeholder: '+61 000 000 000' } ]; const selectedPlaceholder = mockPlaceholders.find(function(item) { return item.countryCode === countryCode; }); if (selectedPlaceholder) { return selectedPlaceholder.placeholder; } return mockPlaceholders[0].placeholder; } function updatePlaceholder(countryCode, fieldName) { if (!countryCode) return; if (!fieldName) return; const phoneInput = document.querySelector('#mce-' + fieldName); if (!phoneInput) return; const placeholder = getDefaultPlaceholder(countryCode); if (placeholder) { phoneInput.placeholder = placeholder; } } function updateCountryCodeInstruction(countryCode, fieldName) { updatePlaceholder(countryCode, fieldName); } function initializeSmsPhoneDropdown(fieldName) { if (!fieldName) return; if (typeof fieldName !== 'string') return; const dropdown = document.querySelector('#country-select-' + fieldName); const displayFlag = document.querySelector('#flag-display-' + fieldName); if (!dropdown) return; if (!displayFlag) return; const smsPhoneData = window.MC.smsPhoneData; if (smsPhoneData) { if (smsPhoneData.programs) { if (Array.isArray(smsPhoneData.programs)) { dropdown.innerHTML = generateDropdownOptions(smsPhoneData.programs); } } } const defaultProgram = getDefaultCountryProgram(smsPhoneData.defaultCountryCode, smsPhoneData.programs); if (defaultProgram) { if (defaultProgram.countryCode) { dropdown.value = defaultProgram.countryCode; const flagSpan = displayFlag.querySelector('#flag-emoji-' + fieldName); if (flagSpan) { flagSpan.textContent = getCountryUnicodeFlag(defaultProgram.countryCode); flagSpan.setAttribute('aria-label', sanitizeHtml(defaultProgram.countryCode) + ' flag'); } updateSmsLegalText(defaultProgram.countryCode, fieldName); updatePlaceholder(defaultProgram.countryCode, fieldName); updateCountryCodeInstruction(defaultProgram.countryCode, fieldName); } } var smsNotRequiredRemoveCountryCodeEnabled = true; var smsField = Object.values({"EMAIL":{"name":"EMAIL","type":"email","required":true},"MMERGE7":{"name":"MMERGE7","type":"radio","required":true}}).find(function(f) { return f.name === fieldName; }); var isRequired = false; if (smsField) { isRequired = smsField.required; } var shouldAppendCountryCode = true; if (smsNotRequiredRemoveCountryCodeEnabled) { shouldAppendCountryCode = isRequired; } var phoneInput = document.querySelector('#mce-' + fieldName); if (phoneInput) { if (defaultProgram) { if (defaultProgram.countryCallingCode) { if (shouldAppendCountryCode) { phoneInput.value = defaultProgram.countryCallingCode; } } } } if (displayFlag) { displayFlag.addEventListener('click', function(e) { dropdown.focus(); }); } if (dropdown) { dropdown.addEventListener('change', function() { const selectedCountry = this.value; if (!selectedCountry) return; if (typeof selectedCountry !== 'string') return; const flagSpan = displayFlag.querySelector('#flag-emoji-' + fieldName); if (flagSpan) { flagSpan.textContent = getCountryUnicodeFlag(selectedCountry); flagSpan.setAttribute('aria-label', sanitizeHtml(selectedCountry) + ' flag'); } const selectedProgram = window.MC.smsPhoneData.programs.find(function(program) { return program.countryCode === selectedCountry; }); var smsField = Object.values({"EMAIL":{"name":"EMAIL","type":"email"},"MMERGE7":{"name":"MMERGE7","type":"radio"}}).find(function(f) { return f.name === fieldName; }); var isRequired = false; if (smsField) { isRequired = smsField.required; } var shouldAppendCountryCode = true; if (smsNotRequiredRemoveCountryCodeEnabled) { shouldAppendCountryCode = isRequired; } var phoneInput = document.querySelector('#mce-' + fieldName); if (phoneInput) { if (selectedProgram) { if (selectedProgram.countryCallingCode) { if (shouldAppendCountryCode) { phoneInput.value = selectedProgram.countryCallingCode; } } } } updateSmsLegalText(selectedCountry, fieldName); updatePlaceholder(selectedCountry, fieldName); updateCountryCodeInstruction(selectedCountry, fieldName); }); } } document.addEventListener('DOMContentLoaded', function() { const smsPhoneFields = document.querySelectorAll('[id^="country-select-"]'); smsPhoneFields.forEach(function(dropdown) { if (dropdown) { const fieldName = dropdown.id.replace('country-select-', ''); initializeSmsPhoneDropdown(fieldName); } }); // — :rocket: NEW LOADING & SUCCESS LOGIC — var submitBtn = document.getElementById('mc-embedded-subscribe'); var formEl = document.getElementById('mc-embedded-subscribe-form'); var successNode = document.getElementById('mce-success-response'); var errorNode = document.getElementById('mce-error-response'); var customSuccessUi = document.getElementById('custom-success-ui'); var customSuccessText = document.getElementById('custom-success-text'); var signup_form = document.getElementById('mc_embed_signup') // 1. Trigger Loader when button clicked if (submitBtn) { if (formEl) { submitBtn.addEventListener('click', function(e) { // Ensure browser validation passes before spinning if (formEl.checkValidity()) { submitBtn.classList.add('is-loading'); } }); } } // 2. Watch Mailchimp's hidden response boxes var observerConfig = { attributes: true, childList: true, subtree: true, attributeFilter: ['style'] }; var mcObserver = new MutationObserver(function(mutations) { // — SUCCESS HAPPENS — if (successNode) { var hasText = false; if (successNode.innerHTML.trim() !== '') { hasText = true; } var isVisible = false; if (successNode.style.display === 'block') { isVisible = true; } if (hasText) { triggerSuccess(); } else if (isVisible) { triggerSuccess(); } } // — ERROR HAPPENS (e.g., already subscribed) — if (errorNode) { var hasErrorText = false; if (errorNode.innerHTML.trim() !== '') { hasErrorText = true; } var isErrorVisible = false; if (errorNode.style.display === 'block') { isErrorVisible = true; } if (hasErrorText) { triggerError(); } else if (isErrorVisible) { triggerError(); } } }); // Execute Success Changes function triggerSuccess() { if (submitBtn) { submitBtn.classList.remove('is-loading'); } if(signup_form) { signup_form.classList.add('submitted') } if (formEl) { formEl.style.display = 'none'; } if (customSuccessUi) { if (customSuccessText) { if (successNode) { customSuccessText.innerHTML = successNode.innerHTML; } } customSuccessUi.style.display = 'block'; } } // Execute Error Changes function triggerError() { if (submitBtn) { submitBtn.classList.remove('is-loading'); } } // Start Observers if (successNode) { mcObserver.observe(successNode, observerConfig); } if (errorNode) { mcObserver.observe(errorNode, observerConfig); } });