1(function ($) { 2 $.ContactForm7Timezone = function () { 3 const self = this; 4 self.countries = moment.tz.countries(); 5 self.allTimezones = moment.tz.names(); 6 self.allCountrysTimezones = {}; 7 self.usersTimezone = moment.tz.guess(); 8 self.usersCountry = ''; 9 10 $.each(self.countries, function(index, value) { 11 12 let country = { 13 code: value, 14 name: '', 15 timezones: moment.tz.zonesForCountry(value) 16 }; 17 self.allCountrysTimezones[value] = country; 18 }); 19 20 return self; 21 }; 22 23 $.ContactForm7Timezone.prototype = { 24 /** 25 * grab the names of countries and display the timezones 26 */ 27 28 init: function() { 29 const self = this; 30 31 // get list of country names 32 $.ajax({ 33 url: "https://restcountries.com/v2/all?fields=name,alpha2Code" 34 }).then(function(data) { 35 $.each(data, function(index, value) { 36 let name = value.name; 37 let code = value.alpha2Code; 38 if(self.allCountrysTimezones[code]) { 39 self.allCountrysTimezones[code].name = name; 40 } 41 }); 42 self.displayTimezones(); 43 return true; 44 }); 45 46 return false; 47 }, 48 /** 49 * get array of timezones in user's country 50 * 51 * @param timezone 52 */ 53 54 getUsersCountrysTimezones: function (timezone) { 55 const self = this; 56 let usersCountrysTimezones = []; 57 58 // build country-specific list based on user's location 59 $.each(self.allCountrysTimezones, function(key, value) { 60 if(value.timezones.includes(timezone)) { 61 self.usersCountry = value.name; 62 self.usersCountrysTimezones = value.timezones; 63 64 return false; 65 } 66 }); 67 68 return self.usersCountrysTimezones; 69 }, 70 /** 71 * populate timezone select field with timezones relevant to user's country 72 * 73 * @param timezones 74 * @param form 75 * @param formField 76 */ 77 populateTimezoneDropdown: function(timezones, form, formField) { 78 const self = this; 79 let dropdownOptions = '<option value="none">No Timezone</option>'; 80 81 // populate field with these timezones 82 $.each(timezones, function(key, value) { 83 dropdownOptions += '<option value=' + value + '>' + value + '</option>'; 84 }); 85 86 // tether to specific form (or related country dropdown) 87 $('#' + form + ' #' + formField).html(dropdownOptions); 88 89 // if user's timezone exists in selected country, set to selected 90 if(timezones.includes(self.usersTimezone)) { 91 $('#' + form + ' #' + formField).val(self.usersTimezone); 92 } 93 }, 94 /** 95 * Display timezones form field per user's location (country) 96 */ 97 displayTimezones: function(){ 98 const self = this; 99 100 // deduce user's country location 101 const usersCountrysTimezones = self.getUsersCountrysTimezones(self.usersTimezone); 102 103 // each instance of timezone dropdown connected to a country dropdown 104 $('.timezone-country').each(function(index) { 105 let formId = ''; 106 if(!$(this).parents('form').attr('id')) { 107 let form = $(this).parents('form').attr('id', 'form-' + (index + 1)); 108 formId = form.attr('id'); 109 } else { 110 // if form already has ID, then form has multiple timezone dropdowns 111 // use existing formId 112 formId = $(this).parents('form').attr('id') 113 } 114 115 const countryField = $(this).val(); 116 const timezoneField = $(this).prev().children('select').attr('id'); 117 118 self.populateTimezoneDropdown(usersCountrysTimezones, formId, timezoneField); 119 120 // change country & timezone fields to reflect user's location 121 $('#' + formId + ' #' + countryField).val(self.usersCountry); 122 123 // add event listener to country select 124 $('#' + formId + ' #' + countryField).change(function() { 125 let countryName = $(this).children(' option:selected').val(); 126 $.each(self.allCountrysTimezones, function(key, value) { 127 if(value.name == countryName) { 128 self.populateTimezoneDropdown(self.allCountrysTimezones[value.code].timezones, formId, timezoneField); 129 130 return false;
131 } 132 }) 133 }); 134 }); 135 } 136 }; 137}(jQuery));
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.