Changeset 2834688
- Timestamp:
- 12/15/2022 09:16:02 PM (3 years ago)
- Location:
- heimdall/trunk
- Files:
-
- 28 added
- 23 deleted
- 10 edited
-
LICENSE (modified) (1 diff)
-
README.md (deleted)
-
addons/custom-stats (deleted)
-
addons/most-used-keywords/assets/css/muk-styles.sass (added)
-
addons/most-used-keywords/assets/js/muk-scripts.js (modified) (2 diffs)
-
addons/most-used-keywords/most-used-keywords.php (modified) (1 diff)
-
addons/most-visited-posts (deleted)
-
addons/post-hits (added)
-
addons/post-hits/index.php (added)
-
addons/post-hits/post-hits.php (added)
-
addons/statistic-shortcode (added)
-
addons/statistic-shortcode/index.php (added)
-
addons/statistic-shortcode/statistic-shortcode.php (added)
-
addons/statistics-shortcode (deleted)
-
addons/today/assets/js/today-admin.js (modified) (5 diffs)
-
addons/today/today.php (modified) (2 diffs)
-
addons/weekly-report/assets/js/statistic-admin.js (added)
-
addons/weekly-report/assets/js/statistics-admin.js (deleted)
-
addons/weekly-report/weekly-report.php (modified) (2 diffs)
-
addons/world-map/assets/countries-50m.json (added)
-
addons/world-map/assets/countries.json (modified) (1 diff)
-
addons/world-map/assets/js/chartjs-geo.js (added)
-
addons/world-map/assets/js/map-widget.js (added)
-
addons/world-map/assets/js/topojson.min.js (deleted)
-
addons/world-map/assets/js/world-map-admin.js (deleted)
-
addons/world-map/assets/world-110m2.json (deleted)
-
addons/world-map/assets/world-country-names.csv (deleted)
-
addons/world-map/database.php (deleted)
-
addons/world-map/world-map-database.php (added)
-
addons/world-map/world-map.php (modified) (1 diff)
-
assets/css/admin-style.css (added)
-
assets/css/admin-style.css.map (added)
-
assets/css/admin-style.sass (added)
-
assets/css/heimdall-settings.css (deleted)
-
assets/css/tabs.css (deleted)
-
assets/css/tabs.css.map (deleted)
-
assets/js/admin-script.js (added)
-
assets/js/chart.bundle.min.js (deleted)
-
assets/js/chart.min.js (added)
-
assets/js/client-ajax.js (deleted)
-
assets/js/client-script.js (added)
-
assets/js/d3.min.js (deleted)
-
assets/js/heimdall-settings.js (deleted)
-
assets/js/heimdall.js (added)
-
assets/js/tabs.js (deleted)
-
heimdall.php (modified) (1 diff)
-
includes/class-addon.php (added)
-
includes/class-communicator.php (added)
-
includes/class-core.php (added)
-
includes/class-cryptor.php (added)
-
includes/class-dashboard.php (added)
-
includes/class-database.php (added)
-
includes/class-helpers.php (added)
-
includes/class-license-manager.php (added)
-
includes/class-options.php (added)
-
includes/commons.php (deleted)
-
includes/dashboard.php (deleted)
-
includes/database.php (deleted)
-
includes/options.php (deleted)
-
readme.txt (modified) (2 diffs)
-
uninstall.php (deleted)
Legend:
- Unmodified
- Added
- Removed
-
heimdall/trunk/LICENSE
r2340542 r2834688 1 MIT License 2 3 Copyright (c) 2018 Arman Afzal <rman.afzal@gmail.com> 4 5 Permission is hereby granted, free of charge, to any person obtaining a copy 6 of this software and associated documentation files (the "Software"), to deal 7 in the Software without restriction, including without limitation the rights 8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 copies of the Software, and to permit persons to whom the Software is 10 furnished to do so, subject to the following conditions: 11 12 The above copyright notice and this permission notice shall be included in all 13 copies or substantial portions of the Software. 14 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 SOFTWARE. 22 1 Copyright (c) 2018-2023 WP Heimdall <info@wp-heimdall.com> 23 2 24 3 Third-Party Licenses : 25 4 5 - tagEditor : 6 The MIT License 26 7 27 tagEditor : 28 29 The MIT License 30 31 32 Chart.js : 33 34 The MIT License 8 - Chart.js : 9 The MIT License -
heimdall/trunk/addons/most-used-keywords/assets/js/muk-scripts.js
r2340542 r2834688 1 ;(($ ) => {1 ;(($ , dt) => { 2 2 "use strict"; 3 3 4 $(document).ready(() => { 4 5 5 6 var $muk = $('#most-used-keywords') 6 7 7 if( heimdall['keywords'].length > 0)8 if(dt['keywords'].length > 0) 8 9 { 9 10 $muk.empty(); 10 11 } 11 12 12 heimdall['keywords'].forEach((e,i)=>{13 dt['keywords'].forEach((e,i)=>{ 13 14 14 15 var $meta = $('<li>') … … 22 23 }) 23 24 24 })(jQuery );25 })(jQuery , HeimdallData); -
heimdall/trunk/addons/most-used-keywords/most-used-keywords.php
r2340542 r2834688 1 1 <?php 2 2 3 /** 4 * MIT License <https://github.com/Rmanaf/wp-heimdall/blob/master/LICENSE> 5 * Copyright (c) 2018 Arman Afzal <rman.afzal@gmail.com> 6 */ 3 namespace Heimdall\Addons; 7 4 8 if (!class_exists('WP_HeimdallAddon_MostUsedKeywords')) { 9 10 class WP_HeimdallAddon_MostUsedKeywords 5 use DateInterval; 6 use DateTime; 7 use Heimdall\Addon; 8 use Heimdall\Dashboard; 9 use Heimdall\Database as db; 10 use Heimdall\Helpers as hp; 11 12 class MostUsedKeywords extends Addon 13 { 14 15 static function setup() 11 16 { 17 add_action('pre_get_posts', [__CLASS__, "pre_get_posts"]); 18 add_action("admin_enqueue_scripts", [__CLASS__, "admin_enqueue_scripts"]); 19 add_action("heimdall__widget_before-content", [__CLASS__, "dashboard_widget"], 10); 12 20 13 // addon slug 14 private static $slug = "most-used-keywords"; 15 16 17 /** 18 * @since 1.3.1 19 */ 20 static function init() 21 { 22 23 $class = get_called_class(); 24 25 add_action("admin_enqueue_scripts", "$class::admin_enqueue_scripts"); 26 27 add_action("heimdall--dashboard-statistic-widget" , "$class::dashboard_statistic_widget" , 10); 28 29 add_filter("heimdall--localize-script", "$class::get_kewords_data", 10, 1); 30 31 } 32 33 /** 34 * @since 1.0.0 35 */ 36 static function admin_enqueue_scripts() 37 { 38 39 $screen = get_current_screen(); 40 41 if(current_user_can( 'administrator' ) && $screen->id == 'dashboard' ) 42 { 43 wp_enqueue_style("muk-styles", WP_Heimdall_Plugin::addon_url(self::$slug , '/assets/css/muk-styles.css'), [], WP_Heimdall_Plugin::$version, "all"); 44 45 wp_enqueue_script("muk-script", WP_Heimdall_Plugin::addon_url(self::$slug , '/assets/js/muk-scripts.js'), ["jquery"], WP_Heimdall_Plugin::$version , true); 46 } 47 48 } 49 50 /** 51 * @since 1.0.0 52 */ 53 static function dashboard_statistic_widget() 54 { 55 ?> 56 <h3><?php esc_html_e("The Most Searched Terms of the Past 7 Days:" , "heimdall"); ?></h3> 57 <ul id="most-used-keywords" class="keywords"> 58 <li><?php esc_html_e("No terms found." , "heimdall"); ?></li> 59 </ul> 60 <?php 61 } 21 add_filter("heimdall__core_localize-script", [__CLASS__, "get_kewords_data"], 10, 1); 22 } 62 23 63 24 64 /** 65 * @since 1.0.0 66 */ 67 static function get_kewords_data($data) 68 { 25 static function admin_enqueue_scripts() 26 { 27 $screen = get_current_screen(); 69 28 70 global $wpdb; 29 if (current_user_can('administrator') && $screen->id == 'dashboard') { 30 wp_enqueue_style("muk-styles", self::get_url('/assets/css/muk-styles.css'), [], HEIMDALL_VER, "all"); 31 wp_enqueue_script("muk-script", self::get_url('/assets/js/muk-scripts.js'), ["jquery"], HEIMDALL_VER, true); 32 } 33 } 71 34 72 // get GMT 73 $cdate = current_time( 'mysql' , 1 ); 35 /** 36 * @since 1.0.0 37 */ 38 static function dashboard_widget() 39 { 40 $template = '<h3>%1$s</h3><ul id="most-used-keywords" class="keywords"><li>%2$s</li></ul>'; 41 $title = esc_html__("The Most Searched Terms of the Past 7 Days:", "heimdall"); 42 $content = esc_html__("No terms found.", "heimdall"); 74 43 75 $start = new DateTime($cdate); 76 $start->sub(new DateInterval('P6D')); 77 78 // today 79 $end = new DateTime($cdate); 80 81 $dt = $wpdb->get_results(self::get_most_used_keywords_query($start , $end), ARRAY_A); 82 83 $data['keywords'] = $dt; 84 85 return $data; 86 87 } 44 printf($template, $title, $content); 45 } 88 46 89 47 90 /** 91 * @since 1.0.0 92 */ 93 static function get_most_used_keywords_query($start , $end) 94 { 95 // convert dates to mysql format 96 $start = $start->format('Y-m-d H:i:s'); 97 $end = $end->format('Y-m-d H:i:s'); 48 /** 49 * @since 1.0.0 50 */ 51 static function get_kewords_data($data) 52 { 53 global $wpdb; 98 54 99 $blog_id = get_current_blog_id(); 55 // get GMT 56 $cdate = current_time('mysql', 1); 100 57 101 $table_name = WP_Heimdall_Database::$table_name; 58 $start = new DateTime($cdate); 59 $start->sub(new DateInterval('P6D')); 102 60 103 return "SELECT COUNT(*) count, meta 61 // today 62 $end = new DateTime($cdate); 63 64 $dt = $wpdb->get_results(self::get_most_used_keywords_query($start, $end), ARRAY_A); 65 66 $data['keywords'] = $dt; 67 68 return $data; 69 } 70 71 72 /** 73 * @since 1.0.0 74 */ 75 static function get_most_used_keywords_query($start, $end) 76 { 77 // convert dates to mysql format 78 $start = $start->format('Y-m-d H:i:s'); 79 $end = $end->format('Y-m-d H:i:s'); 80 81 $blog_id = get_current_blog_id(); 82 83 $table_name = db::get_table(); 84 85 return "SELECT COUNT(*) count, meta 104 86 FROM $table_name 105 87 WHERE `type`='4' AND `blog`='$blog_id' AND `meta` IS NOT NULL AND (`time` BETWEEN '$start' AND '$end') 106 88 GROUP BY meta 107 89 ORDER BY count DESC 108 LIMIT 20" ; 90 LIMIT 20"; 91 } 109 92 93 94 static function pre_get_posts($query) 95 { 96 97 if (is_admin() || is_customize_preview()) { 98 return; 110 99 } 111 100 101 if ($query->is_search() && $query->is_main_query()) { 102 103 $keyword = get_search_query(); 104 105 // ignore whitespace and empty values 106 if (empty(trim($keyword))) { 107 return; 108 } 109 110 $is_mobile = hp::is_mobile_device(); 111 112 db::insert_once( 113 hp::get_ip_address(), 114 null, 115 4, 116 'pre_get_posts', 117 hp::get_url(false), 118 $_SERVER['HTTP_USER_AGENT'] ?: null, 119 is_null($is_mobile) ? 0 : ($is_mobile ? 2 : 1), 120 hp::get_os(), 121 hp::get_browser(), 122 $keyword 123 ); 124 } 112 125 } 113 114 126 } -
heimdall/trunk/addons/today/assets/js/today-admin.js
r2571934 r2834688 1 ; (($ ) => {1 ; (($, hm, dt) => { 2 2 "use strict"; 3 3 4 const _storageKey = "todayAdmin"; 5 4 6 $(document).ready(() => { 5 $.post(heimdall['ajaxurl'], { 7 8 const cache = hm.readFromLocalStorage( _storageKey ); 9 const data = cache?.data; 10 11 if (data) { 12 createChart(data); 13 return; 14 } 15 16 $.post(dt['ajaxurl'], { 6 17 'action': 'heimdall_today_report', 7 '_wpnonce': heimdall['ajaxnonce']18 '_wpnonce': dt['ajaxnonce'] 8 19 }, (res) => { 9 var ctx = $("#statisticsTodayChart")[0];10 11 $("#statisticsTodayChart").parents('.busy').removeClass('busy');12 20 13 21 var now_hour = parseInt(res.data['today_now_hour']); … … 39 47 data: zarray, 40 48 pointRadius: 0, 41 lineTension: 0 49 lineTension: 0, 50 fill: false, 51 cubicInterpolationMode: 'monotone', 52 tension: 0.4 42 53 }, { 43 54 label: 'Unique Visitors', … … 47 58 data: yarray, 48 59 pointRadius: 0, 49 lineTension: 0 60 lineTension: 0, 61 fill: false, 62 cubicInterpolationMode: 'monotone', 63 tension: 0.4 50 64 }, { 51 65 label: 'Home Page', … … 55 69 data: parray, 56 70 pointRadius: 0, 57 lineTension: 0 71 lineTension: 0, 72 fill: false, 73 cubicInterpolationMode: 'monotone', 74 tension: 0.4 58 75 }]; 59 76 60 if ( heimdall['is_multisite'] == '1') {77 if (dt['is_multisite'] == '1') { 61 78 dtset.push({ 62 79 label: 'This Blog', … … 66 83 data: warray, 67 84 pointRadius: 0, 68 lineTension: 0 85 lineTension: 0, 86 fill: false, 87 cubicInterpolationMode: 'monotone', 88 tension: 0.4 69 89 }); 70 90 } 71 91 72 new Chart(ctx, { 73 type: 'line', 74 data: { 75 labels: Array.apply(null, { length: 24 }).map(Number.call, Number), 76 datasets: dtset 92 hm.updateLocalStorage( _storageKey , dtset , 5 * 60 * 1000 ); 93 94 createChart(dtset); 95 96 }); 97 98 }); 99 100 function createChart(dtset) { 101 102 const ctx = $("#statisticsTodayChart"); 103 104 ctx.parents('.busy').removeClass('busy'); 105 106 new Chart(ctx[0], { 107 type: 'line', 108 data: { 109 labels: Array.apply(null, { length: 24 }).map(Number.call, Number).map(v => _nttr(v) + " - " + _nttr(v+1)), 110 datasets: dtset 111 }, 112 options: { 113 responsive: true, 114 maintainAspectRatio: false, 115 layout: { 116 padding: { 117 left: 5, 118 top: 20, 119 right: 5 120 } 77 121 }, 78 options: { 79 tooltips: { 80 mode: 'index', 81 intersect: false, 82 cornerRadius: 4, 83 footerFontColor: '#ccc', 84 footerFontStyle: 'normal' 122 interaction: { 123 intersect: false, 124 position: 'average', 125 titleAlign: 'center', 126 usePointStyle: true, 127 mode: 'index', 128 axis: 'x' 129 }, 130 plugins: { 131 legend: { 132 display: true, 133 position: 'bottom' 134 } 135 }, 136 scales: { 137 x: { 138 ticks: { 139 callback: _nttr 140 } 85 141 }, 86 responsive: true, 87 maintainAspectRatio: false, 88 scales: { 89 yAxes: [{ 90 ticks: { 91 beginAtZero: true, 92 callback: function (value) { if (value % 1 === 0) { return value; } } 93 } 94 }] 142 y: { 143 beginAtZero: true 95 144 } 96 145 } 97 } );146 } 98 147 }); 99 } );148 } 100 149 150 function _nttr(v){ 151 return (v < 10 ? '0' + v : v) + ":00"; 152 } 101 153 102 })(jQuery );154 })(jQuery, Heimdall, HeimdallData); -
heimdall/trunk/addons/today/today.php
r2571934 r2834688 1 1 <?php 2 2 3 /** 4 * MIT License <https://github.com/Rmanaf/wp-heimdall/blob/master/LICENSE> 5 * Copyright (c) 2018 Arman Afzal <rman.afzal@gmail.com> 6 */ 7 8 if (!class_exists('WP_HeimdallAddon_Today')) { 9 10 11 class WP_HeimdallAddon_Today 3 namespace Heimdall\Addons; 4 5 use DateInterval; 6 use DateTime; 7 use Heimdall\Addon; 8 use Heimdall\Dashboard; 9 use Heimdall\Database; 10 use Heimdall\Options; 11 12 class Today extends Addon 13 { 14 15 static function setup() 16 { 17 add_action("admin_enqueue_scripts", [__CLASS__, "admin_enqueue_scripts"]); 18 add_action("wp_ajax_heimdall_today_report", [__CLASS__, "get_today_report_data"]); 19 20 add_filter("heimdall__widget_tabs", [__CLASS__, "widget_tabs"]); 21 add_filter("heimdall__widget_content", [__CLASS__, "widget_content"]); 22 } 23 24 static function widget_tabs($tabs_html) 25 { 26 return $tabs_html . Dashboard::create_widget_tab( 27 self::get_slug(), 28 esc_html__("Today", "heimdall"), 29 'chart-line' 30 ); 31 } 32 33 34 static function widget_content($tabs_html) 35 { 36 $template = '<div class="chart-container-today" style="%1$s">%2$s</div>'; 37 $style = 'position: relative; width:100%; height:300px;'; 38 $canvas = '<canvas id="statisticsTodayChart"></canvas>'; 39 return $tabs_html . Dashboard::create_widget_tab_content(self::get_slug(), sprintf($template, $style, $canvas)); 40 } 41 42 43 static function admin_enqueue_scripts() 44 { 45 $screen = get_current_screen(); 46 47 if (current_user_can('administrator') && $screen->id == 'dashboard') { 48 self::enqueue_script("today-report", '/assets/js/today-admin.js', true, ['jquery', 'heimdall']); 49 } 50 } 51 52 53 54 static function get_today_report_data() 12 55 { 13 56 14 // addon slug 15 private static $slug = "today"; 57 global $wpdb; 16 58 59 check_ajax_referer("heimdall-nonce"); 17 60 18 /** 19 * @since 1.3.1 20 */ 21 static function init(){ 22 23 $class = get_called_class(); 61 $data = []; 24 62 25 add_action("admin_enqueue_scripts", "$class::admin_enqueue_scripts"); 63 // get GMT 64 $cdate = current_time('mysql', 1); 26 65 27 // add_action("heimdall--dashboard-statistic-widget" , "$class::dashboard_statistic_widget" , 20); 66 // start from 6 days ago 67 $start = new DateTime($cdate); 68 $start->sub(new DateInterval('PT24H')); 28 69 29 add_action("heimdall--dashboard-statistic-widget-tabs", "$class::dashboard_statistic_widget_tabs", 10); 70 // today 71 $end = new DateTime($cdate); 30 72 31 add_action("heimdall--dashboard-statistic-widget-tab-content", "$class::dashboard_statistic_widget_tab_content", 10);73 $data['today'] = $wpdb->get_results(self::get_chart_query($start, $end), ARRAY_A); 32 74 33 //add_filter("heimdall--localize-script", "$class::get_today_report_data" , 10, 1);75 $data['today_now_hour'] = (new DateTime($cdate))->format('H'); 34 76 35 add_action("wp_ajax_heimdall_today_report" , "$class::get_today_report_data"); 36 37 } 77 wp_send_json_success($data); 78 } 38 79 39 /**40 * @since 1.3.141 */42 static function dashboard_statistic_widget(){43 }80 /** 81 * @since 1.0.0 82 */ 83 static function get_chart_query($start, $end) 84 { 44 85 86 // convert dates to mysql format 87 $start = $start->format('Y-m-d H:i:s'); 88 $end = $end->format('Y-m-d H:i:s'); 45 89 46 /** 47 * @since 1.3.1 48 */ 49 static function dashboard_statistic_widget_tabs(){ 50 WP_Heimdall_Dashboard::create_admin_widget_tab(esc_html__( "Today", "heimdall") , "today"); 51 } 90 $blog_id = get_current_blog_id(); 52 91 92 $extra_field = is_multisite() ? ", SUM(case when blog='$blog_id' then 1 else 0 end) w" : ""; 53 93 54 /** 55 * @since 1.3.1 56 */ 57 static function dashboard_statistic_widget_tab_content(){ 94 $table_name = Database::get_table(); 58 95 59 ob_start();96 $hook = Options::get_statistic_hook(); 60 97 61 ?> 62 <div class="chart-container-today" style="position: relative; width:100%; height:300px;"> 63 <canvas id="statisticsTodayChart"></canvas> 64 </div> 65 <?php 66 67 WP_Heimdall_Dashboard::create_admin_widget_tab_content("today" , ob_get_clean() ); 68 69 } 70 71 72 /** 73 * @since 1.3.1 74 */ 75 static function admin_enqueue_scripts(){ 76 77 $screen = get_current_screen(); 78 79 if(current_user_can( 'administrator' ) && $screen->id == 'dashboard' ) 80 { 81 82 wp_enqueue_script("today-report", WP_Heimdall_Plugin::addon_url(self::$slug , '/assets/js/today-admin.js'), ['jquery'], WP_Heimdall_Plugin::$version, true); 83 84 } 85 86 } 87 88 89 /** 90 * @since 1.3.1 91 */ 92 static function get_today_report_data(){ 93 94 global $wpdb; 95 96 check_ajax_referer("heimdall-nonce"); 97 98 $data = []; 99 100 // get GMT 101 $cdate = current_time( 'mysql' , 1 ); 102 103 // start from 6 days ago 104 $start = new DateTime($cdate); 105 $start->sub(new DateInterval('PT24H')); 106 107 // today 108 $end = new DateTime($cdate); 109 110 $data['today'] = $wpdb->get_results(self::get_chart_query($start , $end), ARRAY_A ); 111 112 $data['today_now_hour'] = (new DateTime($cdate))->format('H'); 113 114 wp_send_json_success( $data ); 115 116 } 117 118 /** 119 * @since 1.0.0 120 */ 121 static function get_chart_query($start , $end) 122 { 123 124 // convert dates to mysql format 125 $start = $start->format('Y-m-d H:i:s'); 126 $end = $end->format('Y-m-d H:i:s'); 127 128 $blog_id = get_current_blog_id(); 129 130 $extra_field = is_multisite() ? ", SUM(case when blog='$blog_id' then 1 else 0 end) w" : ""; 131 132 $table_name = WP_Heimdall_Database::$table_name; 133 134 return "SELECT HOUR(time) x, 98 return "SELECT HOUR(time) x, 135 99 COUNT(DISTINCT ip) y, 136 100 COUNT(*) z, … … 140 104 WHERE (time BETWEEN '$start' AND '$end') 141 105 AND type != '4' 106 AND hook = '$hook' 142 107 GROUP BY x"; 143 144 }145 146 108 } 147 148 109 } -
heimdall/trunk/addons/weekly-report/weekly-report.php
r2571934 r2834688 1 1 <?php 2 2 3 /** 4 * MIT License <https://github.com/Rmanaf/wp-heimdall/blob/master/LICENSE> 5 * Copyright (c) 2018 Arman Afzal <rman.afzal@gmail.com> 6 */ 7 8 if (!class_exists('WP_HeimdallAddon_WeeklyReport')) { 9 10 class WP_HeimdallAddon_WeeklyReport 11 { 12 13 // addon slug 14 private static $slug = "weekly-report"; 3 namespace Heimdall\Addons; 4 5 use DateInterval; 6 use DateTime; 7 use Heimdall\Addon; 8 use Heimdall\Dashboard; 9 use Heimdall\Database; 10 11 class WeeklyReport extends Addon 12 { 15 13 16 14 17 /** 18 * @since 1.3.1 19 */ 20 static function init() 21 { 15 static function setup() 16 { 17 add_action("admin_enqueue_scripts", [__CLASS__, "admin_enqueue_scripts"]); 18 add_action("wp_ajax_heimdall_weekly_report", [__CLASS__, "get_weekly_report_data"]); 22 19 23 $class = get_called_class(); 24 25 add_action("admin_enqueue_scripts", "$class::admin_enqueue_scripts"); 26 27 // add_action("heimdall--dashboard-statistic-widget" , "$class::dashboard_statistic_widget" , 10); 28 29 add_action("heimdall--dashboard-statistic-widget-tabs", "$class::dashboard_statistic_widget_tabs", 10); 30 31 add_action("heimdall--dashboard-statistic-widget-tab-content", "$class::dashboard_statistic_widget_tab_content", 10); 32 33 //add_filter("heimdall--localize-script", "$class::get_weekly_report_data" , 10, 1); 34 35 add_action("wp_ajax_heimdall_weekly_report" , "$class::get_weekly_report_data"); 36 37 } 38 39 /** 40 * @since 1.0.0 41 */ 42 static function admin_enqueue_scripts() 43 { 44 45 $screen = get_current_screen(); 46 47 if(current_user_can( 'administrator' ) && $screen->id == 'dashboard' ) 48 { 49 50 wp_enqueue_script("weekly-report", WP_Heimdall_Plugin::addon_url(self::$slug , '/assets/js/statistics-admin.js'), ['jquery'], WP_Heimdall_Plugin::$version, true); 51 52 } 53 54 } 55 56 57 /** 58 * @since 1.0.0 59 */ 60 static function dashboard_statistic_widget() 61 { 62 } 20 add_filter("heimdall__widget_tabs", [__CLASS__, "widget_tabs"]); 21 add_filter("heimdall__widget_content", [__CLASS__, "widget_content"]); 22 } 63 23 64 24 25 static function admin_enqueue_scripts() 26 { 27 $screen = get_current_screen(); 65 28 66 /** 67 * @since 1.3.1 68 */ 69 static function dashboard_statistic_widget_tabs(){ 70 71 WP_Heimdall_Dashboard::create_admin_widget_tab(esc_html__( "Visits (7 days)", "heimdall" ) , "views"); 72 29 if (current_user_can('administrator') && $screen->id == 'dashboard') { 30 self::enqueue_script("weekly-report", '/assets/js/statistic-admin.js', true, ['jquery', 'heimdall']); 73 31 } 74 75 /** 76 * @since 1.3.1 77 */ 78 static function dashboard_statistic_widget_tab_content(){ 79 80 ob_start(); 81 82 ?> 83 <div class="chart-container" style="position: relative; width:100%; height:300px;"> 84 <canvas id="statisticsChart"></canvas> 85 </div> 86 <?php 87 88 WP_Heimdall_Dashboard::create_admin_widget_tab_content("views" , ob_get_clean() ); 89 90 } 32 } 91 33 92 34 93 /** 94 * @since 1.0.0 95 */ 96 static function get_weekly_report_data() 97 { 35 static function widget_tabs($tabs_html) 36 { 37 return $tabs_html . Dashboard::create_widget_tab( 38 self::get_slug(), 39 esc_html__("Visits (7 days)", "heimdall"), 40 'calendar' 41 ); 42 } 98 43 99 global $wpdb; 44 static function widget_content($tabs_html) 45 { 46 $template = '<div class="chart-container" style="%1$s">%2$s</div>'; 47 $style = 'position: relative; width:100%; height:300px;'; 48 $canvas = '<canvas id="statisticChart"></canvas>'; 100 49 101 check_ajax_referer("heimdall-nonce"); 50 return $tabs_html . Dashboard::create_widget_tab_content( 51 self::get_slug(), 52 sprintf($template, $style, $canvas) 53 ); 54 } 102 55 103 // get GMT104 $cdate = current_time( 'mysql' , 1 );56 static function get_weekly_report_data() 57 { 105 58 106 // start from 6 days ago 107 $start = new DateTime($cdate); 108 $start->sub(new DateInterval('P6D')); 59 global $wpdb; 109 60 110 // today 111 $end = new DateTime($cdate); 61 check_ajax_referer("heimdall-nonce"); 112 62 113 $data = $wpdb->get_results(self::get_chart_query($start , $end), ARRAY_A ); 63 // get GMT 64 $cdate = current_time('mysql', 1); 114 65 115 wp_send_json_success( $data ); 66 // start from 6 days ago 67 $start = new DateTime($cdate); 68 $start->sub(new DateInterval('P6D')); 116 69 117 } 70 // today 71 $end = new DateTime($cdate); 118 72 119 /** 120 * @since 1.0.0 121 */ 122 static function get_chart_query($start , $end) 123 { 73 $data = $wpdb->get_results(self::get_chart_query($start, $end), ARRAY_A); 124 74 125 // convert dates to mysql format 126 $start = $start->format('Y-m-d H:i:s'); 127 $end = $end->format('Y-m-d H:i:s'); 75 wp_send_json_success($data); 76 } 128 77 129 $blog_id = get_current_blog_id();130 131 $extra_field = is_multisite() ? ", SUM(case when blog='$blog_id' then 1 else 0 end) w" : "";132 133 $table_name = WP_Heimdall_Database::$table_name;78 /** 79 * @since 1.0.0 80 */ 81 static function get_chart_query($start, $end) 82 { 134 83 135 return "SELECT WEEKDAY(time) x, 84 // convert dates to mysql format 85 $start = $start->format('Y-m-d H:i:s'); 86 $end = $end->format('Y-m-d H:i:s'); 87 88 $blog_id = get_current_blog_id(); 89 90 $extra_field = is_multisite() ? ", SUM(case when blog='$blog_id' then 1 else 0 end) w" : ""; 91 92 $table_name = Database::get_table(); 93 94 return "SELECT WEEKDAY(time) x, 136 95 COUNT(DISTINCT ip) y, 137 96 COUNT(*) z, … … 142 101 AND type != '4' 143 102 GROUP BY x"; 144 145 }146 147 148 103 } 149 150 104 } -
heimdall/trunk/addons/world-map/assets/countries.json
r2340542 r2834688 1 [ 2 { 3 "timezones": [ 4 "America/Aruba" 5 ], 6 "latlng": [ 7 12.5, 8 -69.96666666 9 ], 10 "name": "Aruba", 11 "code": "AW", 12 "capital": "Oranjestad" 13 }, 14 { 15 "timezones": [ 16 "Asia/Kabul" 17 ], 18 "latlng": [ 19 33, 20 65 21 ], 22 "name": "Afghanistan", 23 "code": "AF", 24 "capital": "Kabul" 25 }, 26 { 27 "timezones": [ 28 "Africa/Luanda" 29 ], 30 "latlng": [ 31 -12.5, 32 18.5 33 ], 34 "name": "Angola", 35 "code": "AO", 36 "capital": "Luanda" 37 }, 38 { 39 "timezones": [ 40 "America/Anguilla" 41 ], 42 "latlng": [ 43 18.25, 44 -63.16666666 45 ], 46 "name": "Anguilla", 47 "code": "AI", 48 "capital": "The Valley" 49 }, 50 { 51 "timezones": [ 52 "Europe/Mariehamn" 53 ], 54 "latlng": [ 55 60.116667, 56 19.9 57 ], 58 "name": "\u00c5land Islands", 59 "code": "AX", 60 "capital": "Mariehamn" 61 }, 62 { 63 "timezones": [ 64 "Europe/Tirane" 65 ], 66 "latlng": [ 67 41, 68 20 69 ], 70 "name": "Albania", 71 "code": "AL", 72 "capital": "Tirana" 73 }, 74 { 75 "timezones": [ 76 "Europe/Andorra" 77 ], 78 "latlng": [ 79 42.5, 80 1.5 81 ], 82 "name": "Andorra", 83 "code": "AD", 84 "capital": "Andorra la Vella" 85 }, 86 { 87 "timezones": [ 88 "Asia/Dubai" 89 ], 90 "latlng": [ 91 24, 92 54 93 ], 94 "name": "United Arab Emirates", 95 "code": "AE", 96 "capital": "Abu Dhabi" 97 }, 98 { 99 "timezones": [ 100 "America/Argentina/Buenos_Aires", 101 "America/Argentina/Cordoba", 102 "America/Argentina/Salta", 103 "America/Argentina/Jujuy", 104 "America/Argentina/Tucuman", 105 "America/Argentina/Catamarca", 106 "America/Argentina/La_Rioja", 107 "America/Argentina/San_Juan", 108 "America/Argentina/Mendoza", 109 "America/Argentina/San_Luis", 110 "America/Argentina/Rio_Gallegos", 111 "America/Argentina/Ushuaia" 112 ], 113 "latlng": [ 114 -34, 115 -64 116 ], 117 "name": "Argentina", 118 "code": "AR", 119 "capital": "Buenos Aires" 120 }, 121 { 122 "timezones": [ 123 "Asia/Yerevan" 124 ], 125 "latlng": [ 126 40, 127 45 128 ], 129 "name": "Armenia", 130 "code": "AM", 131 "capital": "Yerevan" 132 }, 133 { 134 "timezones": [ 135 "Pacific/Pago_Pago" 136 ], 137 "latlng": [ 138 -14.33333333, 139 -170 140 ], 141 "name": "American Samoa", 142 "code": "AS", 143 "capital": "Pago Pago" 144 }, 145 { 146 "timezones": [ 147 "Antarctica/McMurdo", 148 "Antarctica/Casey", 149 "Antarctica/Davis", 150 "Antarctica/DumontDUrville", 151 "Antarctica/Mawson", 152 "Antarctica/Palmer", 153 "Antarctica/Rothera", 154 "Antarctica/Syowa", 155 "Antarctica/Troll", 156 "Antarctica/Vostok" 157 ], 158 "latlng": [ 159 -90, 160 0 161 ], 162 "name": "Antarctica", 163 "code": "AQ", 164 "capital": null 165 }, 166 { 167 "timezones": [ 168 "Indian/Kerguelen" 169 ], 170 "latlng": [ 171 -49.25, 172 69.167 173 ], 174 "name": "French Southern and Antarctic Lands", 175 "code": "TF", 176 "capital": "Port-aux-Fran\u00e7ais" 177 }, 178 { 179 "timezones": [ 180 "America/Antigua" 181 ], 182 "latlng": [ 183 17.05, 184 -61.8 185 ], 186 "name": "Antigua and Barbuda", 187 "code": "AG", 188 "capital": "Saint John's" 189 }, 190 { 191 "timezones": [ 192 "Australia/Lord_Howe", 193 "Antarctica/Macquarie", 194 "Australia/Hobart", 195 "Australia/Currie", 196 "Australia/Melbourne", 197 "Australia/Sydney", 198 "Australia/Broken_Hill", 199 "Australia/Brisbane", 200 "Australia/Lindeman", 201 "Australia/Adelaide", 202 "Australia/Darwin", 203 "Australia/Perth", 204 "Australia/Eucla" 205 ], 206 "latlng": [ 207 -27, 208 133 209 ], 210 "name": "Australia", 211 "code": "AU", 212 "capital": "Canberra" 213 }, 214 { 215 "timezones": [ 216 "Europe/Vienna" 217 ], 218 "latlng": [ 219 47.33333333, 220 13.33333333 221 ], 222 "name": "Austria", 223 "code": "AT", 224 "capital": "Vienna" 225 }, 226 { 227 "timezones": [ 228 "Asia/Baku" 229 ], 230 "latlng": [ 231 40.5, 232 47.5 233 ], 234 "name": "Azerbaijan", 235 "code": "AZ", 236 "capital": "Baku" 237 }, 238 { 239 "timezones": [ 240 "Africa/Bujumbura" 241 ], 242 "latlng": [ 243 -3.5, 244 30 245 ], 246 "name": "Burundi", 247 "code": "BI", 248 "capital": "Bujumbura" 249 }, 250 { 251 "timezones": [ 252 "Europe/Brussels" 253 ], 254 "latlng": [ 255 50.83333333, 256 4 257 ], 258 "name": "Belgium", 259 "code": "BE", 260 "capital": "Brussels" 261 }, 262 { 263 "timezones": [ 264 "Africa/Porto-Novo" 265 ], 266 "latlng": [ 267 9.5, 268 2.25 269 ], 270 "name": "Benin", 271 "code": "BJ", 272 "capital": "Porto-Novo" 273 }, 274 { 275 "timezones": [ 276 "Africa/Ouagadougou" 277 ], 278 "latlng": [ 279 13, 280 -2 281 ], 282 "name": "Burkina Faso", 283 "code": "BF", 284 "capital": "Ouagadougou" 285 }, 286 { 287 "timezones": [ 288 "Asia/Dhaka" 289 ], 290 "latlng": [ 291 24, 292 90 293 ], 294 "name": "Bangladesh", 295 "code": "BD", 296 "capital": "Dhaka" 297 }, 298 { 299 "timezones": [ 300 "Europe/Sofia" 301 ], 302 "latlng": [ 303 43, 304 25 305 ], 306 "name": "Bulgaria", 307 "code": "BG", 308 "capital": "Sofia" 309 }, 310 { 311 "timezones": [ 312 "Asia/Bahrain" 313 ], 314 "latlng": [ 315 26, 316 50.55 317 ], 318 "name": "Bahrain", 319 "code": "BH", 320 "capital": "Manama" 321 }, 322 { 323 "timezones": [ 324 "America/Nassau" 325 ], 326 "latlng": [ 327 24.25, 328 -76 329 ], 330 "name": "Bahamas", 331 "code": "BS", 332 "capital": "Nassau" 333 }, 334 { 335 "timezones": [ 336 "Europe/Sarajevo" 337 ], 338 "latlng": [ 339 44, 340 18 341 ], 342 "name": "Bosnia and Herzegovina", 343 "code": "BA", 344 "capital": "Sarajevo" 345 }, 346 { 347 "timezones": [ 348 "America/St_Barthelemy" 349 ], 350 "latlng": [ 351 18.5, 352 -63.41666666 353 ], 354 "name": "Saint Barth\u00e9lemy", 355 "code": "BL", 356 "capital": "Gustavia" 357 }, 358 { 359 "timezones": [ 360 "Europe/Minsk" 361 ], 362 "latlng": [ 363 53, 364 28 365 ], 366 "name": "Belarus", 367 "code": "BY", 368 "capital": "Minsk" 369 }, 370 { 371 "timezones": [ 372 "America/Belize" 373 ], 374 "latlng": [ 375 17.25, 376 -88.75 377 ], 378 "name": "Belize", 379 "code": "BZ", 380 "capital": "Belmopan" 381 }, 382 { 383 "timezones": [ 384 "Atlantic/Bermuda" 385 ], 386 "latlng": [ 387 32.33333333, 388 -64.75 389 ], 390 "name": "Bermuda", 391 "code": "BM", 392 "capital": "Hamilton" 393 }, 394 { 395 "timezones": [ 396 "America/La_Paz" 397 ], 398 "latlng": [ 399 -17, 400 -65 401 ], 402 "name": "Bolivia", 403 "code": "BO", 404 "capital": "Sucre" 405 }, 406 { 407 "timezones": [ 408 "America/Noronha", 409 "America/Belem", 410 "America/Fortaleza", 411 "America/Recife", 412 "America/Araguaina", 413 "America/Maceio", 414 "America/Bahia", 415 "America/Sao_Paulo", 416 "America/Campo_Grande", 417 "America/Cuiaba", 418 "America/Santarem", 419 "America/Porto_Velho", 420 "America/Boa_Vista", 421 "America/Manaus", 422 "America/Eirunepe", 423 "America/Rio_Branco" 424 ], 425 "latlng": [ 426 -10, 427 -55 428 ], 429 "name": "Brazil", 430 "code": "BR", 431 "capital": "Bras\u00edlia" 432 }, 433 { 434 "timezones": [ 435 "America/Barbados" 436 ], 437 "latlng": [ 438 13.16666666, 439 -59.53333333 440 ], 441 "name": "Barbados", 442 "code": "BB", 443 "capital": "Bridgetown" 444 }, 445 { 446 "timezones": [ 447 "Asia/Brunei" 448 ], 449 "latlng": [ 450 4.5, 451 114.66666666 452 ], 453 "name": "Brunei", 454 "code": "BN", 455 "capital": "Bandar Seri Begawan" 456 }, 457 { 458 "timezones": [ 459 "Asia/Thimphu" 460 ], 461 "latlng": [ 462 27.5, 463 90.5 464 ], 465 "name": "Bhutan", 466 "code": "BT", 467 "capital": "Thimphu" 468 }, 469 { 470 "timezones": [ 471 "Europe/Oslo" 472 ], 473 "latlng": [ 474 -54.43333333, 475 3.4 476 ], 477 "name": "Bouvet Island", 478 "code": "BV", 479 "capital": null 480 }, 481 { 482 "timezones": [ 483 "Africa/Gaborone" 484 ], 485 "latlng": [ 486 -22, 487 24 488 ], 489 "name": "Botswana", 490 "code": "BW", 491 "capital": "Gaborone" 492 }, 493 { 494 "timezones": [ 495 "Africa/Bangui" 496 ], 497 "latlng": [ 498 7, 499 21 500 ], 501 "name": "Central African Republic", 502 "code": "CF", 503 "capital": "Bangui" 504 }, 505 { 506 "timezones": [ 507 "America/St_Johns", 508 "America/Halifax", 509 "America/Glace_Bay", 510 "America/Moncton", 511 "America/Goose_Bay", 512 "America/Blanc-Sablon", 513 "America/Toronto", 514 "America/Nipigon", 515 "America/Thunder_Bay", 516 "America/Iqaluit", 517 "America/Pangnirtung", 518 "America/Atikokan", 519 "America/Winnipeg", 520 "America/Rainy_River", 521 "America/Resolute", 522 "America/Rankin_Inlet", 523 "America/Regina", 524 "America/Swift_Current", 525 "America/Edmonton", 526 "America/Cambridge_Bay", 527 "America/Yellowknife", 528 "America/Inuvik", 529 "America/Creston", 530 "America/Dawson_Creek", 531 "America/Fort_Nelson", 532 "America/Vancouver", 533 "America/Whitehorse", 534 "America/Dawson" 535 ], 536 "latlng": [ 537 60, 538 -95 539 ], 540 "name": "Canada", 541 "code": "CA", 542 "capital": "Ottawa" 543 }, 544 { 545 "timezones": [ 546 "Indian/Cocos" 547 ], 548 "latlng": [ 549 -12.5, 550 96.83333333 551 ], 552 "name": "Cocos (Keeling) Islands", 553 "code": "CC", 554 "capital": "West Island" 555 }, 556 { 557 "timezones": [ 558 "Europe/Zurich" 559 ], 560 "latlng": [ 561 47, 562 8 563 ], 564 "name": "Switzerland", 565 "code": "CH", 566 "capital": "Bern" 567 }, 568 { 569 "timezones": [ 570 "America/Santiago", 571 "Pacific/Easter" 572 ], 573 "latlng": [ 574 -30, 575 -71 576 ], 577 "name": "Chile", 578 "code": "CL", 579 "capital": "Santiago" 580 }, 581 { 582 "timezones": [ 583 "Asia/Shanghai", 584 "Asia/Urumqi" 585 ], 586 "latlng": [ 587 35, 588 105 589 ], 590 "name": "China", 591 "code": "CN", 592 "capital": "Beijing" 593 }, 594 { 595 "timezones": [ 596 "Africa/Abidjan" 597 ], 598 "latlng": [ 599 8, 600 -5 601 ], 602 "name": "Ivory Coast", 603 "code": "CI", 604 "capital": "Yamoussoukro" 605 }, 606 { 607 "timezones": [ 608 "Africa/Douala" 609 ], 610 "latlng": [ 611 6, 612 12 613 ], 614 "name": "Cameroon", 615 "code": "CM", 616 "capital": "Yaound\u00e9" 617 }, 618 { 619 "timezones": [ 620 "Africa/Kinshasa", 621 "Africa/Lubumbashi" 622 ], 623 "latlng": [ 624 0, 625 25 626 ], 627 "name": "DR Congo", 628 "code": "CD", 629 "capital": "Kinshasa" 630 }, 631 { 632 "timezones": [ 633 "Africa/Brazzaville" 634 ], 635 "latlng": [ 636 -1, 637 15 638 ], 639 "name": "Republic of the Congo", 640 "code": "CG", 641 "capital": "Brazzaville" 642 }, 643 { 644 "timezones": [ 645 "Pacific/Rarotonga" 646 ], 647 "latlng": [ 648 -21.23333333, 649 -159.76666666 650 ], 651 "name": "Cook Islands", 652 "code": "CK", 653 "capital": "Avarua" 654 }, 655 { 656 "timezones": [ 657 "America/Bogota" 658 ], 659 "latlng": [ 660 4, 661 -72 662 ], 663 "name": "Colombia", 664 "code": "CO", 665 "capital": "Bogot\u00e1" 666 }, 667 { 668 "timezones": [ 669 "Indian/Comoro" 670 ], 671 "latlng": [ 672 -12.16666666, 673 44.25 674 ], 675 "name": "Comoros", 676 "code": "KM", 677 "capital": "Moroni" 678 }, 679 { 680 "timezones": [ 681 "Atlantic/Cape_Verde" 682 ], 683 "latlng": [ 684 16, 685 -24 686 ], 687 "name": "Cape Verde", 688 "code": "CV", 689 "capital": "Praia" 690 }, 691 { 692 "timezones": [ 693 "America/Costa_Rica" 694 ], 695 "latlng": [ 696 10, 697 -84 698 ], 699 "name": "Costa Rica", 700 "code": "CR", 701 "capital": "San Jos\u00e9" 702 }, 703 { 704 "timezones": [ 705 "America/Havana" 706 ], 707 "latlng": [ 708 21.5, 709 -80 710 ], 711 "name": "Cuba", 712 "code": "CU", 713 "capital": "Havana" 714 }, 715 { 716 "timezones": [ 717 "America/Curacao" 718 ], 719 "latlng": [ 720 12.116667, 721 -68.933333 722 ], 723 "name": "Cura\u00e7ao", 724 "code": "CW", 725 "capital": "Willemstad" 726 }, 727 { 728 "timezones": [ 729 "Indian/Christmas" 730 ], 731 "latlng": [ 732 -10.5, 733 105.66666666 734 ], 735 "name": "Christmas Island", 736 "code": "CX", 737 "capital": "Flying Fish Cove" 738 }, 739 { 740 "timezones": [ 741 "America/Cayman" 742 ], 743 "latlng": [ 744 19.5, 745 -80.5 746 ], 747 "name": "Cayman Islands", 748 "code": "KY", 749 "capital": "George Town" 750 }, 751 { 752 "timezones": [ 753 "Asia/Nicosia" 754 ], 755 "latlng": [ 756 35, 757 33 758 ], 759 "name": "Cyprus", 760 "code": "CY", 761 "capital": "Nicosia" 762 }, 763 { 764 "timezones": [ 765 "Europe/Prague" 766 ], 767 "latlng": [ 768 49.75, 769 15.5 770 ], 771 "name": "Czech Republic", 772 "code": "CZ", 773 "capital": "Prague" 774 }, 775 { 776 "timezones": [ 777 "Europe/Berlin", 778 "Europe/Busingen" 779 ], 780 "latlng": [ 781 51, 782 9 783 ], 784 "name": "Germany", 785 "code": "DE", 786 "capital": "Berlin" 787 }, 788 { 789 "timezones": [ 790 "Africa/Djibouti" 791 ], 792 "latlng": [ 793 11.5, 794 43 795 ], 796 "name": "Djibouti", 797 "code": "DJ", 798 "capital": "Djibouti" 799 }, 800 { 801 "timezones": [ 802 "America/Dominica" 803 ], 804 "latlng": [ 805 15.41666666, 806 -61.33333333 807 ], 808 "name": "Dominica", 809 "code": "DM", 810 "capital": "Roseau" 811 }, 812 { 813 "timezones": [ 814 "Europe/Copenhagen" 815 ], 816 "latlng": [ 817 56, 818 10 819 ], 820 "name": "Denmark", 821 "code": "DK", 822 "capital": "Copenhagen" 823 }, 824 { 825 "timezones": [ 826 "America/Santo_Domingo" 827 ], 828 "latlng": [ 829 19, 830 -70.66666666 831 ], 832 "name": "Dominican Republic", 833 "code": "DO", 834 "capital": "Santo Domingo" 835 }, 836 { 837 "timezones": [ 838 "Africa/Algiers" 839 ], 840 "latlng": [ 841 28, 842 3 843 ], 844 "name": "Algeria", 845 "code": "DZ", 846 "capital": "Algiers" 847 }, 848 { 849 "timezones": [ 850 "America/Guayaquil", 851 "Pacific/Galapagos" 852 ], 853 "latlng": [ 854 -2, 855 -77.5 856 ], 857 "name": "Ecuador", 858 "code": "EC", 859 "capital": "Quito" 860 }, 861 { 862 "timezones": [ 863 "Africa/Cairo" 864 ], 865 "latlng": [ 866 27, 867 30 868 ], 869 "name": "Egypt", 870 "code": "EG", 871 "capital": "Cairo" 872 }, 873 { 874 "timezones": [ 875 "Africa/Asmara" 876 ], 877 "latlng": [ 878 15, 879 39 880 ], 881 "name": "Eritrea", 882 "code": "ER", 883 "capital": "Asmara" 884 }, 885 { 886 "timezones": [ 887 "Africa/El_Aaiun" 888 ], 889 "latlng": [ 890 24.5, 891 -13 892 ], 893 "name": "Western Sahara", 894 "code": "EH", 895 "capital": "El Aai\u00fan" 896 }, 897 { 898 "timezones": [ 899 "Europe/Madrid", 900 "Africa/Ceuta", 901 "Atlantic/Canary" 902 ], 903 "latlng": [ 904 40, 905 -4 906 ], 907 "name": "Spain", 908 "code": "ES", 909 "capital": "Madrid" 910 }, 911 { 912 "timezones": [ 913 "Europe/Tallinn" 914 ], 915 "latlng": [ 916 59, 917 26 918 ], 919 "name": "Estonia", 920 "code": "EE", 921 "capital": "Tallinn" 922 }, 923 { 924 "timezones": [ 925 "Africa/Addis_Ababa" 926 ], 927 "latlng": [ 928 8, 929 38 930 ], 931 "name": "Ethiopia", 932 "code": "ET", 933 "capital": "Addis Ababa" 934 }, 935 { 936 "timezones": [ 937 "Europe/Helsinki" 938 ], 939 "latlng": [ 940 64, 941 26 942 ], 943 "name": "Finland", 944 "code": "FI", 945 "capital": "Helsinki" 946 }, 947 { 948 "timezones": [ 949 "Pacific/Fiji" 950 ], 951 "latlng": [ 952 -18, 953 175 954 ], 955 "name": "Fiji", 956 "code": "FJ", 957 "capital": "Suva" 958 }, 959 { 960 "timezones": [ 961 "Atlantic/Stanley" 962 ], 963 "latlng": [ 964 -51.75, 965 -59 966 ], 967 "name": "Falkland Islands", 968 "code": "FK", 969 "capital": "Stanley" 970 }, 971 { 972 "timezones": [ 973 "Europe/Paris" 974 ], 975 "latlng": [ 976 46, 977 2 978 ], 979 "name": "France", 980 "code": "FR", 981 "capital": "Paris" 982 }, 983 { 984 "timezones": [ 985 "Atlantic/Faroe" 986 ], 987 "latlng": [ 988 62, 989 -7 990 ], 991 "name": "Faroe Islands", 992 "code": "FO", 993 "capital": "T\u00f3rshavn" 994 }, 995 { 996 "timezones": [ 997 "Pacific/Chuuk", 998 "Pacific/Pohnpei", 999 "Pacific/Kosrae" 1000 ], 1001 "latlng": [ 1002 6.91666666, 1003 158.25 1004 ], 1005 "name": "Micronesia", 1006 "code": "FM", 1007 "capital": "Palikir" 1008 }, 1009 { 1010 "timezones": [ 1011 "Africa/Libreville" 1012 ], 1013 "latlng": [ 1014 -1, 1015 11.75 1016 ], 1017 "name": "Gabon", 1018 "code": "GA", 1019 "capital": "Libreville" 1020 }, 1021 { 1022 "timezones": [ 1023 "Europe/London" 1024 ], 1025 "latlng": [ 1026 54, 1027 -2 1028 ], 1029 "name": "United Kingdom", 1030 "code": "GB", 1031 "capital": "London" 1032 }, 1033 { 1034 "timezones": [ 1035 "Asia/Tbilisi" 1036 ], 1037 "latlng": [ 1038 42, 1039 43.5 1040 ], 1041 "name": "Georgia", 1042 "code": "GE", 1043 "capital": "Tbilisi" 1044 }, 1045 { 1046 "timezones": [ 1047 "Europe/Guernsey" 1048 ], 1049 "latlng": [ 1050 49.46666666, 1051 -2.58333333 1052 ], 1053 "name": "Guernsey", 1054 "code": "GG", 1055 "capital": "St. Peter Port" 1056 }, 1057 { 1058 "timezones": [ 1059 "Africa/Accra" 1060 ], 1061 "latlng": [ 1062 8, 1063 -2 1064 ], 1065 "name": "Ghana", 1066 "code": "GH", 1067 "capital": "Accra" 1068 }, 1069 { 1070 "timezones": [ 1071 "Europe/Gibraltar" 1072 ], 1073 "latlng": [ 1074 36.13333333, 1075 -5.35 1076 ], 1077 "name": "Gibraltar", 1078 "code": "GI", 1079 "capital": "Gibraltar" 1080 }, 1081 { 1082 "timezones": [ 1083 "Africa/Conakry" 1084 ], 1085 "latlng": [ 1086 11, 1087 -10 1088 ], 1089 "name": "Guinea", 1090 "code": "GN", 1091 "capital": "Conakry" 1092 }, 1093 { 1094 "timezones": [ 1095 "America/Guadeloupe" 1096 ], 1097 "latlng": [ 1098 16.25, 1099 -61.583333 1100 ], 1101 "name": "Guadeloupe", 1102 "code": "GP", 1103 "capital": "Basse-Terre" 1104 }, 1105 { 1106 "timezones": [ 1107 "Africa/Banjul" 1108 ], 1109 "latlng": [ 1110 13.46666666, 1111 -16.56666666 1112 ], 1113 "name": "Gambia", 1114 "code": "GM", 1115 "capital": "Banjul" 1116 }, 1117 { 1118 "timezones": [ 1119 "Africa/Bissau" 1120 ], 1121 "latlng": [ 1122 12, 1123 -15 1124 ], 1125 "name": "Guinea-Bissau", 1126 "code": "GW", 1127 "capital": "Bissau" 1128 }, 1129 { 1130 "timezones": [ 1131 "Africa/Malabo" 1132 ], 1133 "latlng": [ 1134 2, 1135 10 1136 ], 1137 "name": "Equatorial Guinea", 1138 "code": "GQ", 1139 "capital": "Malabo" 1140 }, 1141 { 1142 "timezones": [ 1143 "Europe/Athens" 1144 ], 1145 "latlng": [ 1146 39, 1147 22 1148 ], 1149 "name": "Greece", 1150 "code": "GR", 1151 "capital": "Athens" 1152 }, 1153 { 1154 "timezones": [ 1155 "America/Grenada" 1156 ], 1157 "latlng": [ 1158 12.11666666, 1159 -61.66666666 1160 ], 1161 "name": "Grenada", 1162 "code": "GD", 1163 "capital": "St. George's" 1164 }, 1165 { 1166 "timezones": [ 1167 "America/Godthab", 1168 "America/Danmarkshavn", 1169 "America/Scoresbysund", 1170 "America/Thule" 1171 ], 1172 "latlng": [ 1173 72, 1174 -40 1175 ], 1176 "name": "Greenland", 1177 "code": "GL", 1178 "capital": "Nuuk" 1179 }, 1180 { 1181 "timezones": [ 1182 "America/Guatemala" 1183 ], 1184 "latlng": [ 1185 15.5, 1186 -90.25 1187 ], 1188 "name": "Guatemala", 1189 "code": "GT", 1190 "capital": "Guatemala City" 1191 }, 1192 { 1193 "timezones": [ 1194 "America/Cayenne" 1195 ], 1196 "latlng": [ 1197 4, 1198 -53 1199 ], 1200 "name": "French Guiana", 1201 "code": "GF", 1202 "capital": "Cayenne" 1203 }, 1204 { 1205 "timezones": [ 1206 "Pacific/Guam" 1207 ], 1208 "latlng": [ 1209 13.46666666, 1210 144.78333333 1211 ], 1212 "name": "Guam", 1213 "code": "GU", 1214 "capital": "Hag\u00e5t\u00f1a" 1215 }, 1216 { 1217 "timezones": [ 1218 "America/Guyana" 1219 ], 1220 "latlng": [ 1221 5, 1222 -59 1223 ], 1224 "name": "Guyana", 1225 "code": "GY", 1226 "capital": "Georgetown" 1227 }, 1228 { 1229 "timezones": [ 1230 "Asia/Hong_Kong" 1231 ], 1232 "latlng": [ 1233 22.267, 1234 114.188 1235 ], 1236 "name": "Hong Kong", 1237 "code": "HK", 1238 "capital": "City of Victoria" 1239 }, 1240 { 1241 "timezones": [ 1242 "America/Tegucigalpa" 1243 ], 1244 "latlng": [ 1245 15, 1246 -86.5 1247 ], 1248 "name": "Honduras", 1249 "code": "HN", 1250 "capital": "Tegucigalpa" 1251 }, 1252 { 1253 "timezones": [ 1254 "Europe/Zagreb" 1255 ], 1256 "latlng": [ 1257 45.16666666, 1258 15.5 1259 ], 1260 "name": "Croatia", 1261 "code": "HR", 1262 "capital": "Zagreb" 1263 }, 1264 { 1265 "timezones": [ 1266 "America/Port-au-Prince" 1267 ], 1268 "latlng": [ 1269 19, 1270 -72.41666666 1271 ], 1272 "name": "Haiti", 1273 "code": "HT", 1274 "capital": "Port-au-Prince" 1275 }, 1276 { 1277 "timezones": [ 1278 "Europe/Budapest" 1279 ], 1280 "latlng": [ 1281 47, 1282 20 1283 ], 1284 "name": "Hungary", 1285 "code": "HU", 1286 "capital": "Budapest" 1287 }, 1288 { 1289 "timezones": [ 1290 "Asia/Jakarta", 1291 "Asia/Pontianak", 1292 "Asia/Makassar", 1293 "Asia/Jayapura" 1294 ], 1295 "latlng": [ 1296 -5, 1297 120 1298 ], 1299 "name": "Indonesia", 1300 "code": "ID", 1301 "capital": "Jakarta" 1302 }, 1303 { 1304 "timezones": [ 1305 "Europe/Isle_of_Man" 1306 ], 1307 "latlng": [ 1308 54.25, 1309 -4.5 1310 ], 1311 "name": "Isle of Man", 1312 "code": "IM", 1313 "capital": "Douglas" 1314 }, 1315 { 1316 "timezones": [ 1317 "Asia/Kolkata" 1318 ], 1319 "latlng": [ 1320 20, 1321 77 1322 ], 1323 "name": "India", 1324 "code": "IN", 1325 "capital": "New Delhi" 1326 }, 1327 { 1328 "timezones": [ 1329 "Indian/Chagos" 1330 ], 1331 "latlng": [ 1332 -6, 1333 71.5 1334 ], 1335 "name": "British Indian Ocean Territory", 1336 "code": "IO", 1337 "capital": "Diego Garcia" 1338 }, 1339 { 1340 "timezones": [ 1341 "Europe/Dublin" 1342 ], 1343 "latlng": [ 1344 53, 1345 -8 1346 ], 1347 "name": "Ireland", 1348 "code": "IE", 1349 "capital": "Dublin" 1350 }, 1351 { 1352 "timezones": [ 1353 "Asia/Tehran" 1354 ], 1355 "latlng": [ 1356 32, 1357 53 1358 ], 1359 "name": "Iran", 1360 "code": "IR", 1361 "capital": "Tehran" 1362 }, 1363 { 1364 "timezones": [ 1365 "Asia/Baghdad" 1366 ], 1367 "latlng": [ 1368 33, 1369 44 1370 ], 1371 "name": "Iraq", 1372 "code": "IQ", 1373 "capital": "Baghdad" 1374 }, 1375 { 1376 "timezones": [ 1377 "Atlantic/Reykjavik" 1378 ], 1379 "latlng": [ 1380 65, 1381 -18 1382 ], 1383 "name": "Iceland", 1384 "code": "IS", 1385 "capital": "Reykjavik" 1386 }, 1387 { 1388 "timezones": [ 1389 "Asia/Jerusalem" 1390 ], 1391 "latlng": [ 1392 31.47, 1393 35.13 1394 ], 1395 "name": "Israel", 1396 "code": "IL", 1397 "capital": "Jerusalem" 1398 }, 1399 { 1400 "timezones": [ 1401 "Europe/Rome" 1402 ], 1403 "latlng": [ 1404 42.83333333, 1405 12.83333333 1406 ], 1407 "name": "Italy", 1408 "code": "IT", 1409 "capital": "Rome" 1410 }, 1411 { 1412 "timezones": [ 1413 "America/Jamaica" 1414 ], 1415 "latlng": [ 1416 18.25, 1417 -77.5 1418 ], 1419 "name": "Jamaica", 1420 "code": "JM", 1421 "capital": "Kingston" 1422 }, 1423 { 1424 "timezones": [ 1425 "Europe/Jersey" 1426 ], 1427 "latlng": [ 1428 49.25, 1429 -2.16666666 1430 ], 1431 "name": "Jersey", 1432 "code": "JE", 1433 "capital": "Saint Helier" 1434 }, 1435 { 1436 "timezones": [ 1437 "Asia/Amman" 1438 ], 1439 "latlng": [ 1440 31, 1441 36 1442 ], 1443 "name": "Jordan", 1444 "code": "JO", 1445 "capital": "Amman" 1446 }, 1447 { 1448 "timezones": [ 1449 "Asia/Tokyo" 1450 ], 1451 "latlng": [ 1452 36, 1453 138 1454 ], 1455 "name": "Japan", 1456 "code": "JP", 1457 "capital": "Tokyo" 1458 }, 1459 { 1460 "timezones": [ 1461 "Asia/Almaty", 1462 "Asia/Qyzylorda", 1463 "Asia/Aqtobe", 1464 "Asia/Aqtau", 1465 "Asia/Oral" 1466 ], 1467 "latlng": [ 1468 48, 1469 68 1470 ], 1471 "name": "Kazakhstan", 1472 "code": "KZ", 1473 "capital": "Astana" 1474 }, 1475 { 1476 "timezones": [ 1477 "Africa/Nairobi" 1478 ], 1479 "latlng": [ 1480 1, 1481 38 1482 ], 1483 "name": "Kenya", 1484 "code": "KE", 1485 "capital": "Nairobi" 1486 }, 1487 { 1488 "timezones": [ 1489 "Asia/Bishkek" 1490 ], 1491 "latlng": [ 1492 41, 1493 75 1494 ], 1495 "name": "Kyrgyzstan", 1496 "code": "KG", 1497 "capital": "Bishkek" 1498 }, 1499 { 1500 "timezones": [ 1501 "Asia/Phnom_Penh" 1502 ], 1503 "latlng": [ 1504 13, 1505 105 1506 ], 1507 "name": "Cambodia", 1508 "code": "KH", 1509 "capital": "Phnom Penh" 1510 }, 1511 { 1512 "timezones": [ 1513 "Pacific/Tarawa", 1514 "Pacific/Enderbury", 1515 "Pacific/Kiritimati" 1516 ], 1517 "latlng": [ 1518 1.41666666, 1519 173 1520 ], 1521 "name": "Kiribati", 1522 "code": "KI", 1523 "capital": "South Tarawa" 1524 }, 1525 { 1526 "timezones": [ 1527 "America/St_Kitts" 1528 ], 1529 "latlng": [ 1530 17.33333333, 1531 -62.75 1532 ], 1533 "name": "Saint Kitts and Nevis", 1534 "code": "KN", 1535 "capital": "Basseterre" 1536 }, 1537 { 1538 "timezones": [ 1539 "Asia/Seoul" 1540 ], 1541 "latlng": [ 1542 37, 1543 127.5 1544 ], 1545 "name": "South Korea", 1546 "code": "KR", 1547 "capital": "Seoul" 1548 }, 1549 { 1550 "timezones": ["Europe/Belgrade"], 1551 "latlng": [ 1552 42.666667, 1553 21.166667 1554 ], 1555 "name": "Kosovo", 1556 "code": "XK", 1557 "capital": "Pristina" 1558 }, 1559 { 1560 "timezones": [ 1561 "Asia/Kuwait" 1562 ], 1563 "latlng": [ 1564 29.5, 1565 45.75 1566 ], 1567 "name": "Kuwait", 1568 "code": "KW", 1569 "capital": "Kuwait City" 1570 }, 1571 { 1572 "timezones": [ 1573 "Asia/Vientiane" 1574 ], 1575 "latlng": [ 1576 18, 1577 105 1578 ], 1579 "name": "Laos", 1580 "code": "LA", 1581 "capital": "Vientiane" 1582 }, 1583 { 1584 "timezones": [ 1585 "Asia/Beirut" 1586 ], 1587 "latlng": [ 1588 33.83333333, 1589 35.83333333 1590 ], 1591 "name": "Lebanon", 1592 "code": "LB", 1593 "capital": "Beirut" 1594 }, 1595 { 1596 "timezones": [ 1597 "Africa/Monrovia" 1598 ], 1599 "latlng": [ 1600 6.5, 1601 -9.5 1602 ], 1603 "name": "Liberia", 1604 "code": "LR", 1605 "capital": "Monrovia" 1606 }, 1607 { 1608 "timezones": [ 1609 "Africa/Tripoli" 1610 ], 1611 "latlng": [ 1612 25, 1613 17 1614 ], 1615 "name": "Libya", 1616 "code": "LY", 1617 "capital": "Tripoli" 1618 }, 1619 { 1620 "timezones": [ 1621 "America/St_Lucia" 1622 ], 1623 "latlng": [ 1624 13.88333333, 1625 -60.96666666 1626 ], 1627 "name": "Saint Lucia", 1628 "code": "LC", 1629 "capital": "Castries" 1630 }, 1631 { 1632 "timezones": [ 1633 "Europe/Vaduz" 1634 ], 1635 "latlng": [ 1636 47.26666666, 1637 9.53333333 1638 ], 1639 "name": "Liechtenstein", 1640 "code": "LI", 1641 "capital": "Vaduz" 1642 }, 1643 { 1644 "timezones": [ 1645 "Asia/Colombo" 1646 ], 1647 "latlng": [ 1648 7, 1649 81 1650 ], 1651 "name": "Sri Lanka", 1652 "code": "LK", 1653 "capital": "Colombo" 1654 }, 1655 { 1656 "timezones": [ 1657 "Africa/Maseru" 1658 ], 1659 "latlng": [ 1660 -29.5, 1661 28.5 1662 ], 1663 "name": "Lesotho", 1664 "code": "LS", 1665 "capital": "Maseru" 1666 }, 1667 { 1668 "timezones": [ 1669 "Europe/Vilnius" 1670 ], 1671 "latlng": [ 1672 56, 1673 24 1674 ], 1675 "name": "Lithuania", 1676 "code": "LT", 1677 "capital": "Vilnius" 1678 }, 1679 { 1680 "timezones": [ 1681 "Europe/Luxembourg" 1682 ], 1683 "latlng": [ 1684 49.75, 1685 6.16666666 1686 ], 1687 "name": "Luxembourg", 1688 "code": "LU", 1689 "capital": "Luxembourg" 1690 }, 1691 { 1692 "timezones": [ 1693 "Europe/Riga" 1694 ], 1695 "latlng": [ 1696 57, 1697 25 1698 ], 1699 "name": "Latvia", 1700 "code": "LV", 1701 "capital": "Riga" 1702 }, 1703 { 1704 "timezones": [ 1705 "Asia/Macau" 1706 ], 1707 "latlng": [ 1708 22.16666666, 1709 113.55 1710 ], 1711 "name": "Macau", 1712 "code": "MO", 1713 "capital": null 1714 }, 1715 { 1716 "timezones": [ 1717 "America/Marigot" 1718 ], 1719 "latlng": [ 1720 18.08333333, 1721 -63.95 1722 ], 1723 "name": "Saint Martin", 1724 "code": "MF", 1725 "capital": "Marigot" 1726 }, 1727 { 1728 "timezones": [ 1729 "Africa/Casablanca" 1730 ], 1731 "latlng": [ 1732 32, 1733 -5 1734 ], 1735 "name": "Morocco", 1736 "code": "MA", 1737 "capital": "Rabat" 1738 }, 1739 { 1740 "timezones": [ 1741 "Europe/Monaco" 1742 ], 1743 "latlng": [ 1744 43.73333333, 1745 7.4 1746 ], 1747 "name": "Monaco", 1748 "code": "MC", 1749 "capital": "Monaco" 1750 }, 1751 { 1752 "timezones": [ 1753 "Europe/Chisinau" 1754 ], 1755 "latlng": [ 1756 47, 1757 29 1758 ], 1759 "name": "Moldova", 1760 "code": "MD", 1761 "capital": "Chi\u0219in\u0103u" 1762 }, 1763 { 1764 "timezones": [ 1765 "Indian/Antananarivo" 1766 ], 1767 "latlng": [ 1768 -20, 1769 47 1770 ], 1771 "name": "Madagascar", 1772 "code": "MG", 1773 "capital": "Antananarivo" 1774 }, 1775 { 1776 "timezones": [ 1777 "Indian/Maldives" 1778 ], 1779 "latlng": [ 1780 3.25, 1781 73 1782 ], 1783 "name": "Maldives", 1784 "code": "MV", 1785 "capital": "Mal\u00e9" 1786 }, 1787 { 1788 "timezones": [ 1789 "America/Mexico_City", 1790 "America/Cancun", 1791 "America/Merida", 1792 "America/Monterrey", 1793 "America/Matamoros", 1794 "America/Mazatlan", 1795 "America/Chihuahua", 1796 "America/Ojinaga", 1797 "America/Hermosillo", 1798 "America/Tijuana", 1799 "America/Bahia_Banderas" 1800 ], 1801 "latlng": [ 1802 23, 1803 -102 1804 ], 1805 "name": "Mexico", 1806 "code": "MX", 1807 "capital": "Mexico City" 1808 }, 1809 { 1810 "timezones": [ 1811 "Pacific/Majuro", 1812 "Pacific/Kwajalein" 1813 ], 1814 "latlng": [ 1815 9, 1816 168 1817 ], 1818 "name": "Marshall Islands", 1819 "code": "MH", 1820 "capital": "Majuro" 1821 }, 1822 { 1823 "timezones": [ 1824 "Europe/Skopje" 1825 ], 1826 "latlng": [ 1827 41.83333333, 1828 22 1829 ], 1830 "name": "Macedonia", 1831 "code": "MK", 1832 "capital": "Skopje" 1833 }, 1834 { 1835 "timezones": [ 1836 "Africa/Bamako" 1837 ], 1838 "latlng": [ 1839 17, 1840 -4 1841 ], 1842 "name": "Mali", 1843 "code": "ML", 1844 "capital": "Bamako" 1845 }, 1846 { 1847 "timezones": [ 1848 "Europe/Malta" 1849 ], 1850 "latlng": [ 1851 35.83333333, 1852 14.58333333 1853 ], 1854 "name": "Malta", 1855 "code": "MT", 1856 "capital": "Valletta" 1857 }, 1858 { 1859 "timezones": [ 1860 "Asia/Rangoon" 1861 ], 1862 "latlng": [ 1863 22, 1864 98 1865 ], 1866 "name": "Myanmar", 1867 "code": "MM", 1868 "capital": "Naypyidaw" 1869 }, 1870 { 1871 "timezones": [ 1872 "Europe/Podgorica" 1873 ], 1874 "latlng": [ 1875 42.5, 1876 19.3 1877 ], 1878 "name": "Montenegro", 1879 "code": "ME", 1880 "capital": "Podgorica" 1881 }, 1882 { 1883 "timezones": [ 1884 "Asia/Ulaanbaatar", 1885 "Asia/Hovd", 1886 "Asia/Choibalsan" 1887 ], 1888 "latlng": [ 1889 46, 1890 105 1891 ], 1892 "name": "Mongolia", 1893 "code": "MN", 1894 "capital": "Ulan Bator" 1895 }, 1896 { 1897 "timezones": [ 1898 "Pacific/Saipan" 1899 ], 1900 "latlng": [ 1901 15.2, 1902 145.75 1903 ], 1904 "name": "Northern Mariana Islands", 1905 "code": "MP", 1906 "capital": "Saipan" 1907 }, 1908 { 1909 "timezones": [ 1910 "Africa/Maputo" 1911 ], 1912 "latlng": [ 1913 -18.25, 1914 35 1915 ], 1916 "name": "Mozambique", 1917 "code": "MZ", 1918 "capital": "Maputo" 1919 }, 1920 { 1921 "timezones": [ 1922 "Africa/Nouakchott" 1923 ], 1924 "latlng": [ 1925 20, 1926 -12 1927 ], 1928 "name": "Mauritania", 1929 "code": "MR", 1930 "capital": "Nouakchott" 1931 }, 1932 { 1933 "timezones": [ 1934 "America/Montserrat" 1935 ], 1936 "latlng": [ 1937 16.75, 1938 -62.2 1939 ], 1940 "name": "Montserrat", 1941 "code": "MS", 1942 "capital": "Plymouth" 1943 }, 1944 { 1945 "timezones": [ 1946 "America/Martinique" 1947 ], 1948 "latlng": [ 1949 14.666667, 1950 -61 1951 ], 1952 "name": "Martinique", 1953 "code": "MQ", 1954 "capital": "Fort-de-France" 1955 }, 1956 { 1957 "timezones": [ 1958 "Indian/Mauritius" 1959 ], 1960 "latlng": [ 1961 -20.28333333, 1962 57.55 1963 ], 1964 "name": "Mauritius", 1965 "code": "MU", 1966 "capital": "Port Louis" 1967 }, 1968 { 1969 "timezones": [ 1970 "Africa/Blantyre" 1971 ], 1972 "latlng": [ 1973 -13.5, 1974 34 1975 ], 1976 "name": "Malawi", 1977 "code": "MW", 1978 "capital": "Lilongwe" 1979 }, 1980 { 1981 "timezones": [ 1982 "Asia/Kuala_Lumpur", 1983 "Asia/Kuching" 1984 ], 1985 "latlng": [ 1986 2.5, 1987 112.5 1988 ], 1989 "name": "Malaysia", 1990 "code": "MY", 1991 "capital": "Kuala Lumpur" 1992 }, 1993 { 1994 "timezones": [ 1995 "Indian/Mayotte" 1996 ], 1997 "latlng": [ 1998 -12.83333333, 1999 45.16666666 2000 ], 2001 "name": "Mayotte", 2002 "code": "YT", 2003 "capital": "Mamoudzou" 2004 }, 2005 { 2006 "timezones": [ 2007 "Africa/Windhoek" 2008 ], 2009 "latlng": [ 2010 -22, 2011 17 2012 ], 2013 "name": "Namibia", 2014 "code": "NA", 2015 "capital": "Windhoek" 2016 }, 2017 { 2018 "timezones": [ 2019 "Pacific/Noumea" 2020 ], 2021 "latlng": [ 2022 -21.5, 2023 165.5 2024 ], 2025 "name": "New Caledonia", 2026 "code": "NC", 2027 "capital": "Noum\u00e9a" 2028 }, 2029 { 2030 "timezones": [ 2031 "Africa/Niamey" 2032 ], 2033 "latlng": [ 2034 16, 2035 8 2036 ], 2037 "name": "Niger", 2038 "code": "NE", 2039 "capital": "Niamey" 2040 }, 2041 { 2042 "timezones": [ 2043 "Pacific/Norfolk" 2044 ], 2045 "latlng": [ 2046 -29.03333333, 2047 167.95 2048 ], 2049 "name": "Norfolk Island", 2050 "code": "NF", 2051 "capital": "Kingston" 2052 }, 2053 { 2054 "timezones": [ 2055 "Africa/Lagos" 2056 ], 2057 "latlng": [ 2058 10, 2059 8 2060 ], 2061 "name": "Nigeria", 2062 "code": "NG", 2063 "capital": "Abuja" 2064 }, 2065 { 2066 "timezones": [ 2067 "America/Managua" 2068 ], 2069 "latlng": [ 2070 13, 2071 -85 2072 ], 2073 "name": "Nicaragua", 2074 "code": "NI", 2075 "capital": "Managua" 2076 }, 2077 { 2078 "timezones": [ 2079 "Pacific/Niue" 2080 ], 2081 "latlng": [ 2082 -19.03333333, 2083 -169.86666666 2084 ], 2085 "name": "Niue", 2086 "code": "NU", 2087 "capital": "Alofi" 2088 }, 2089 { 2090 "timezones": [ 2091 "Europe/Amsterdam" 2092 ], 2093 "latlng": [ 2094 52.5, 2095 5.75 2096 ], 2097 "name": "Netherlands", 2098 "code": "NL", 2099 "capital": "Amsterdam" 2100 }, 2101 { 2102 "timezones": [ 2103 "Europe/Oslo" 2104 ], 2105 "latlng": [ 2106 62, 2107 10 2108 ], 2109 "name": "Norway", 2110 "code": "NO", 2111 "capital": "Oslo" 2112 }, 2113 { 2114 "timezones": [ 2115 "Asia/Kathmandu" 2116 ], 2117 "latlng": [ 2118 28, 2119 84 2120 ], 2121 "name": "Nepal", 2122 "code": "NP", 2123 "capital": "Kathmandu" 2124 }, 2125 { 2126 "timezones": [ 2127 "Pacific/Nauru" 2128 ], 2129 "latlng": [ 2130 -0.53333333, 2131 166.91666666 2132 ], 2133 "name": "Nauru", 2134 "code": "NR", 2135 "capital": "Yaren" 2136 }, 2137 { 2138 "timezones": [ 2139 "Pacific/Auckland", 2140 "Pacific/Chatham" 2141 ], 2142 "latlng": [ 2143 -41, 2144 174 2145 ], 2146 "name": "New Zealand", 2147 "code": "NZ", 2148 "capital": "Wellington" 2149 }, 2150 { 2151 "timezones": [ 2152 "Asia/Muscat" 2153 ], 2154 "latlng": [ 2155 21, 2156 57 2157 ], 2158 "name": "Oman", 2159 "code": "OM", 2160 "capital": "Muscat" 2161 }, 2162 { 2163 "timezones": [ 2164 "Asia/Karachi" 2165 ], 2166 "latlng": [ 2167 30, 2168 70 2169 ], 2170 "name": "Pakistan", 2171 "code": "PK", 2172 "capital": "Islamabad" 2173 }, 2174 { 2175 "timezones": [ 2176 "America/Panama" 2177 ], 2178 "latlng": [ 2179 9, 2180 -80 2181 ], 2182 "name": "Panama", 2183 "code": "PA", 2184 "capital": "Panama City" 2185 }, 2186 { 2187 "timezones": [ 2188 "Pacific/Pitcairn" 2189 ], 2190 "latlng": [ 2191 -25.06666666, 2192 -130.1 2193 ], 2194 "name": "Pitcairn Islands", 2195 "code": "PN", 2196 "capital": "Adamstown" 2197 }, 2198 { 2199 "timezones": [ 2200 "America/Lima" 2201 ], 2202 "latlng": [ 2203 -10, 2204 -76 2205 ], 2206 "name": "Peru", 2207 "code": "PE", 2208 "capital": "Lima" 2209 }, 2210 { 2211 "timezones": [ 2212 "Asia/Manila" 2213 ], 2214 "latlng": [ 2215 13, 2216 122 2217 ], 2218 "name": "Philippines", 2219 "code": "PH", 2220 "capital": "Manila" 2221 }, 2222 { 2223 "timezones": [ 2224 "Pacific/Palau" 2225 ], 2226 "latlng": [ 2227 7.5, 2228 134.5 2229 ], 2230 "name": "Palau", 2231 "code": "PW", 2232 "capital": "Ngerulmud" 2233 }, 2234 { 2235 "timezones": [ 2236 "Pacific/Port_Moresby", 2237 "Pacific/Bougainville" 2238 ], 2239 "latlng": [ 2240 -6, 2241 147 2242 ], 2243 "name": "Papua New Guinea", 2244 "code": "PG", 2245 "capital": "Port Moresby" 2246 }, 2247 { 2248 "timezones": [ 2249 "Europe/Warsaw" 2250 ], 2251 "latlng": [ 2252 52, 2253 20 2254 ], 2255 "name": "Poland", 2256 "code": "PL", 2257 "capital": "Warsaw" 2258 }, 2259 { 2260 "timezones": [ 2261 "America/Puerto_Rico" 2262 ], 2263 "latlng": [ 2264 18.25, 2265 -66.5 2266 ], 2267 "name": "Puerto Rico", 2268 "code": "PR", 2269 "capital": "San Juan" 2270 }, 2271 { 2272 "timezones": [ 2273 "Asia/Pyongyang" 2274 ], 2275 "latlng": [ 2276 40, 2277 127 2278 ], 2279 "name": "North Korea", 2280 "code": "KP", 2281 "capital": "Pyongyang" 2282 }, 2283 { 2284 "timezones": [ 2285 "Europe/Lisbon", 2286 "Atlantic/Madeira", 2287 "Atlantic/Azores" 2288 ], 2289 "latlng": [ 2290 39.5, 2291 -8 2292 ], 2293 "name": "Portugal", 2294 "code": "PT", 2295 "capital": "Lisbon" 2296 }, 2297 { 2298 "timezones": [ 2299 "America/Asuncion" 2300 ], 2301 "latlng": [ 2302 -23, 2303 -58 2304 ], 2305 "name": "Paraguay", 2306 "code": "PY", 2307 "capital": "Asunci\u00f3n" 2308 }, 2309 { 2310 "timezones": [ 2311 "Asia/Gaza", 2312 "Asia/Hebron" 2313 ], 2314 "latlng": [ 2315 31.9, 2316 35.2 2317 ], 2318 "name": "Palestine", 2319 "code": "PS", 2320 "capital": "Ramallah" 2321 }, 2322 { 2323 "timezones": [ 2324 "Pacific/Tahiti", 2325 "Pacific/Marquesas", 2326 "Pacific/Gambier" 2327 ], 2328 "latlng": [ 2329 -15, 2330 -140 2331 ], 2332 "name": "French Polynesia", 2333 "code": "PF", 2334 "capital": "Papeet\u0113" 2335 }, 2336 { 2337 "timezones": [ 2338 "Asia/Qatar" 2339 ], 2340 "latlng": [ 2341 25.5, 2342 51.25 2343 ], 2344 "name": "Qatar", 2345 "code": "QA", 2346 "capital": "Doha" 2347 }, 2348 { 2349 "timezones": [ 2350 "Indian/Reunion" 2351 ], 2352 "latlng": [ 2353 -21.15, 2354 55.5 2355 ], 2356 "name": "R\u00e9union", 2357 "code": "RE", 2358 "capital": "Saint-Denis" 2359 }, 2360 { 2361 "timezones": [ 2362 "Europe/Bucharest" 2363 ], 2364 "latlng": [ 2365 46, 2366 25 2367 ], 2368 "name": "Romania", 2369 "code": "RO", 2370 "capital": "Bucharest" 2371 }, 2372 { 2373 "timezones": [ 2374 "Europe/Kaliningrad", 2375 "Europe/Moscow", 2376 "Europe/Simferopol", 2377 "Europe/Volgograd", 2378 "Europe/Kirov", 2379 "Europe/Astrakhan", 2380 "Europe/Samara", 2381 "Europe/Ulyanovsk", 2382 "Asia/Yekaterinburg", 2383 "Asia/Omsk", 2384 "Asia/Novosibirsk", 2385 "Asia/Barnaul", 2386 "Asia/Tomsk", 2387 "Asia/Novokuznetsk", 2388 "Asia/Krasnoyarsk", 2389 "Asia/Irkutsk", 2390 "Asia/Chita", 2391 "Asia/Yakutsk", 2392 "Asia/Khandyga", 2393 "Asia/Vladivostok", 2394 "Asia/Ust-Nera", 2395 "Asia/Magadan", 2396 "Asia/Sakhalin", 2397 "Asia/Srednekolymsk", 2398 "Asia/Kamchatka", 2399 "Asia/Anadyr" 2400 ], 2401 "latlng": [ 2402 60, 2403 100 2404 ], 2405 "name": "Russia", 2406 "code": "RU", 2407 "capital": "Moscow" 2408 }, 2409 { 2410 "timezones": [ 2411 "Africa/Kigali" 2412 ], 2413 "latlng": [ 2414 -2, 2415 30 2416 ], 2417 "name": "Rwanda", 2418 "code": "RW", 2419 "capital": "Kigali" 2420 }, 2421 { 2422 "timezones": [ 2423 "Asia/Riyadh" 2424 ], 2425 "latlng": [ 2426 25, 2427 45 2428 ], 2429 "name": "Saudi Arabia", 2430 "code": "SA", 2431 "capital": "Riyadh" 2432 }, 2433 { 2434 "timezones": [ 2435 "Africa/Khartoum" 2436 ], 2437 "latlng": [ 2438 15, 2439 30 2440 ], 2441 "name": "Sudan", 2442 "code": "SD", 2443 "capital": "Khartoum" 2444 }, 2445 { 2446 "timezones": [ 2447 "Africa/Dakar" 2448 ], 2449 "latlng": [ 2450 14, 2451 -14 2452 ], 2453 "name": "Senegal", 2454 "code": "SN", 2455 "capital": "Dakar" 2456 }, 2457 { 2458 "timezones": [ 2459 "Asia/Singapore" 2460 ], 2461 "latlng": [ 2462 1.36666666, 2463 103.8 2464 ], 2465 "name": "Singapore", 2466 "code": "SG", 2467 "capital": "Singapore" 2468 }, 2469 { 2470 "timezones": [ 2471 "Atlantic/South_Georgia" 2472 ], 2473 "latlng": [ 2474 -54.5, 2475 -37 2476 ], 2477 "name": "South Georgia", 2478 "code": "GS", 2479 "capital": "King Edward Point" 2480 }, 2481 { 2482 "timezones": [ 2483 "Arctic/Longyearbyen" 2484 ], 2485 "latlng": [ 2486 78, 2487 20 2488 ], 2489 "name": "Svalbard and Jan Mayen", 2490 "code": "SJ", 2491 "capital": "Longyearbyen" 2492 }, 2493 { 2494 "timezones": [ 2495 "Pacific/Guadalcanal" 2496 ], 2497 "latlng": [ 2498 -8, 2499 159 2500 ], 2501 "name": "Solomon Islands", 2502 "code": "SB", 2503 "capital": "Honiara" 2504 }, 2505 { 2506 "timezones": [ 2507 "Africa/Freetown" 2508 ], 2509 "latlng": [ 2510 8.5, 2511 -11.5 2512 ], 2513 "name": "Sierra Leone", 2514 "code": "SL", 2515 "capital": "Freetown" 2516 }, 2517 { 2518 "timezones": [ 2519 "America/El_Salvador" 2520 ], 2521 "latlng": [ 2522 13.83333333, 2523 -88.91666666 2524 ], 2525 "name": "El Salvador", 2526 "code": "SV", 2527 "capital": "San Salvador" 2528 }, 2529 { 2530 "timezones": [ 2531 "Europe/San_Marino" 2532 ], 2533 "latlng": [ 2534 43.76666666, 2535 12.41666666 2536 ], 2537 "name": "San Marino", 2538 "code": "SM", 2539 "capital": "City of San Marino" 2540 }, 2541 { 2542 "timezones": [ 2543 "Africa/Mogadishu" 2544 ], 2545 "latlng": [ 2546 10, 2547 49 2548 ], 2549 "name": "Somalia", 2550 "code": "SO", 2551 "capital": "Mogadishu" 2552 }, 2553 { 2554 "timezones": [ 2555 "America/Miquelon" 2556 ], 2557 "latlng": [ 2558 46.83333333, 2559 -56.33333333 2560 ], 2561 "name": "Saint Pierre and Miquelon", 2562 "code": "PM", 2563 "capital": "Saint-Pierre" 2564 }, 2565 { 2566 "timezones": [ 2567 "Europe/Belgrade" 2568 ], 2569 "latlng": [ 2570 44, 2571 21 2572 ], 2573 "name": "Serbia", 2574 "code": "RS", 2575 "capital": "Belgrade" 2576 }, 2577 { 2578 "timezones": [ 2579 "Africa/Juba" 2580 ], 2581 "latlng": [ 2582 7, 2583 30 2584 ], 2585 "name": "South Sudan", 2586 "code": "SS", 2587 "capital": "Juba" 2588 }, 2589 { 2590 "timezones": [ 2591 "Africa/Sao_Tome" 2592 ], 2593 "latlng": [ 2594 1, 2595 7 2596 ], 2597 "name": "S\u00e3o Tom\u00e9 and Pr\u00edncipe", 2598 "code": "ST", 2599 "capital": "S\u00e3o Tom\u00e9" 2600 }, 2601 { 2602 "timezones": [ 2603 "America/Paramaribo" 2604 ], 2605 "latlng": [ 2606 4, 2607 -56 2608 ], 2609 "name": "Suriname", 2610 "code": "SR", 2611 "capital": "Paramaribo" 2612 }, 2613 { 2614 "timezones": [ 2615 "Europe/Bratislava" 2616 ], 2617 "latlng": [ 2618 48.66666666, 2619 19.5 2620 ], 2621 "name": "Slovakia", 2622 "code": "SK", 2623 "capital": "Bratislava" 2624 }, 2625 { 2626 "timezones": [ 2627 "Europe/Ljubljana" 2628 ], 2629 "latlng": [ 2630 46.11666666, 2631 14.81666666 2632 ], 2633 "name": "Slovenia", 2634 "code": "SI", 2635 "capital": "Ljubljana" 2636 }, 2637 { 2638 "timezones": [ 2639 "Europe/Stockholm" 2640 ], 2641 "latlng": [ 2642 62, 2643 15 2644 ], 2645 "name": "Sweden", 2646 "code": "SE", 2647 "capital": "Stockholm" 2648 }, 2649 { 2650 "timezones": [ 2651 "Africa/Mbabane" 2652 ], 2653 "latlng": [ 2654 -26.5, 2655 31.5 2656 ], 2657 "name": "Swaziland", 2658 "code": "SZ", 2659 "capital": "Lobamba" 2660 }, 2661 { 2662 "timezones": [ 2663 "America/Lower_Princes" 2664 ], 2665 "latlng": [ 2666 18.033333, 2667 -63.05 2668 ], 2669 "name": "Sint Maarten", 2670 "code": "SX", 2671 "capital": "Philipsburg" 2672 }, 2673 { 2674 "timezones": [ 2675 "Indian/Mahe" 2676 ], 2677 "latlng": [ 2678 -4.58333333, 2679 55.66666666 2680 ], 2681 "name": "Seychelles", 2682 "code": "SC", 2683 "capital": "Victoria" 2684 }, 2685 { 2686 "timezones": [ 2687 "Asia/Damascus" 2688 ], 2689 "latlng": [ 2690 35, 2691 38 2692 ], 2693 "name": "Syria", 2694 "code": "SY", 2695 "capital": "Damascus" 2696 }, 2697 { 2698 "timezones": [ 2699 "America/Grand_Turk" 2700 ], 2701 "latlng": [ 2702 21.75, 2703 -71.58333333 2704 ], 2705 "name": "Turks and Caicos Islands", 2706 "code": "TC", 2707 "capital": "Cockburn Town" 2708 }, 2709 { 2710 "timezones": [ 2711 "Africa/Ndjamena" 2712 ], 2713 "latlng": [ 2714 15, 2715 19 2716 ], 2717 "name": "Chad", 2718 "code": "TD", 2719 "capital": "N'Djamena" 2720 }, 2721 { 2722 "timezones": [ 2723 "Africa/Lome" 2724 ], 2725 "latlng": [ 2726 8, 2727 1.16666666 2728 ], 2729 "name": "Togo", 2730 "code": "TG", 2731 "capital": "Lom\u00e9" 2732 }, 2733 { 2734 "timezones": [ 2735 "Asia/Bangkok" 2736 ], 2737 "latlng": [ 2738 15, 2739 100 2740 ], 2741 "name": "Thailand", 2742 "code": "TH", 2743 "capital": "Bangkok" 2744 }, 2745 { 2746 "timezones": [ 2747 "Asia/Dushanbe" 2748 ], 2749 "latlng": [ 2750 39, 2751 71 2752 ], 2753 "name": "Tajikistan", 2754 "code": "TJ", 2755 "capital": "Dushanbe" 2756 }, 2757 { 2758 "timezones": [ 2759 "Pacific/Fakaofo" 2760 ], 2761 "latlng": [ 2762 -9, 2763 -172 2764 ], 2765 "name": "Tokelau", 2766 "code": "TK", 2767 "capital": "Fakaofo" 2768 }, 2769 { 2770 "timezones": [ 2771 "Asia/Ashgabat" 2772 ], 2773 "latlng": [ 2774 40, 2775 60 2776 ], 2777 "name": "Turkmenistan", 2778 "code": "TM", 2779 "capital": "Ashgabat" 2780 }, 2781 { 2782 "timezones": [ 2783 "Asia/Dili" 2784 ], 2785 "latlng": [ 2786 -8.83333333, 2787 125.91666666 2788 ], 2789 "name": "Timor-Leste", 2790 "code": "TL", 2791 "capital": "Dili" 2792 }, 2793 { 2794 "timezones": [ 2795 "Pacific/Tongatapu" 2796 ], 2797 "latlng": [ 2798 -20, 2799 -175 2800 ], 2801 "name": "Tonga", 2802 "code": "TO", 2803 "capital": "Nuku'alofa" 2804 }, 2805 { 2806 "timezones": [ 2807 "America/Port_of_Spain" 2808 ], 2809 "latlng": [ 2810 11, 2811 -61 2812 ], 2813 "name": "Trinidad and Tobago", 2814 "code": "TT", 2815 "capital": "Port of Spain" 2816 }, 2817 { 2818 "timezones": [ 2819 "Africa/Tunis" 2820 ], 2821 "latlng": [ 2822 34, 2823 9 2824 ], 2825 "name": "Tunisia", 2826 "code": "TN", 2827 "capital": "Tunis" 2828 }, 2829 { 2830 "timezones": [ 2831 "Europe/Istanbul" 2832 ], 2833 "latlng": [ 2834 39, 2835 35 2836 ], 2837 "name": "Turkey", 2838 "code": "TR", 2839 "capital": "Ankara" 2840 }, 2841 { 2842 "timezones": [ 2843 "Pacific/Funafuti" 2844 ], 2845 "latlng": [ 2846 -8, 2847 178 2848 ], 2849 "name": "Tuvalu", 2850 "code": "TV", 2851 "capital": "Funafuti" 2852 }, 2853 { 2854 "timezones": [ 2855 "Asia/Taipei" 2856 ], 2857 "latlng": [ 2858 23.5, 2859 121 2860 ], 2861 "name": "Taiwan", 2862 "code": "TW", 2863 "capital": "Taipei" 2864 }, 2865 { 2866 "timezones": [ 2867 "Africa/Dar_es_Salaam" 2868 ], 2869 "latlng": [ 2870 -6, 2871 35 2872 ], 2873 "name": "Tanzania", 2874 "code": "TZ", 2875 "capital": "Dodoma" 2876 }, 2877 { 2878 "timezones": [ 2879 "Africa/Kampala" 2880 ], 2881 "latlng": [ 2882 1, 2883 32 2884 ], 2885 "name": "Uganda", 2886 "code": "UG", 2887 "capital": "Kampala" 2888 }, 2889 { 2890 "timezones": [ 2891 "Europe/Kiev", 2892 "Europe/Uzhgorod", 2893 "Europe/Zaporozhye" 2894 ], 2895 "latlng": [ 2896 49, 2897 32 2898 ], 2899 "name": "Ukraine", 2900 "code": "UA", 2901 "capital": "Kiev" 2902 }, 2903 { 2904 "timezones": [ 2905 "Pacific/Johnston", 2906 "Pacific/Midway", 2907 "Pacific/Wake" 2908 ], 2909 "latlng": [ 2910 19.2911437, 2911 166.618332 2912 ], 2913 "name": "United States Minor Outlying Islands", 2914 "code": "UM", 2915 "capital": null 2916 }, 2917 { 2918 "timezones": [ 2919 "America/Montevideo" 2920 ], 2921 "latlng": [ 2922 -33, 2923 -56 2924 ], 2925 "name": "Uruguay", 2926 "code": "UY", 2927 "capital": "Montevideo" 2928 }, 2929 { 2930 "timezones": [ 2931 "America/New_York", 2932 "America/Detroit", 2933 "America/Kentucky/Louisville", 2934 "America/Kentucky/Monticello", 2935 "America/Indiana/Indianapolis", 2936 "America/Indiana/Vincennes", 2937 "America/Indiana/Winamac", 2938 "America/Indiana/Marengo", 2939 "America/Indiana/Petersburg", 2940 "America/Indiana/Vevay", 2941 "America/Chicago", 2942 "America/Indiana/Tell_City", 2943 "America/Indiana/Knox", 2944 "America/Menominee", 2945 "America/North_Dakota/Center", 2946 "America/North_Dakota/New_Salem", 2947 "America/North_Dakota/Beulah", 2948 "America/Denver", 2949 "America/Boise", 2950 "America/Phoenix", 2951 "America/Los_Angeles", 2952 "America/Anchorage", 2953 "America/Juneau", 2954 "America/Sitka", 2955 "America/Metlakatla", 2956 "America/Yakutat", 2957 "America/Nome", 2958 "America/Adak", 2959 "Pacific/Honolulu" 2960 ], 2961 "latlng": [ 2962 38, 2963 -97 2964 ], 2965 "name": "United States", 2966 "code": "US", 2967 "capital": "Washington D.C." 2968 }, 2969 { 2970 "timezones": [ 2971 "Asia/Samarkand", 2972 "Asia/Tashkent" 2973 ], 2974 "latlng": [ 2975 41, 2976 64 2977 ], 2978 "name": "Uzbekistan", 2979 "code": "UZ", 2980 "capital": "Tashkent" 2981 }, 2982 { 2983 "timezones": [ 2984 "Europe/Vatican" 2985 ], 2986 "latlng": [ 2987 41.9, 2988 12.45 2989 ], 2990 "name": "Vatican City", 2991 "code": "VA", 2992 "capital": "Vatican City" 2993 }, 2994 { 2995 "timezones": [ 2996 "America/St_Vincent" 2997 ], 2998 "latlng": [ 2999 13.25, 3000 -61.2 3001 ], 3002 "name": "Saint Vincent and the Grenadines", 3003 "code": "VC", 3004 "capital": "Kingstown" 3005 }, 3006 { 3007 "timezones": [ 3008 "America/Caracas" 3009 ], 3010 "latlng": [ 3011 8, 3012 -66 3013 ], 3014 "name": "Venezuela", 3015 "code": "VE", 3016 "capital": "Caracas" 3017 }, 3018 { 3019 "timezones": [ 3020 "America/Tortola" 3021 ], 3022 "latlng": [ 3023 18.431383, 3024 -64.62305 3025 ], 3026 "name": "British Virgin Islands", 3027 "code": "VG", 3028 "capital": "Road Town" 3029 }, 3030 { 3031 "timezones": [ 3032 "America/St_Thomas" 3033 ], 3034 "latlng": [ 3035 18.35, 3036 -64.933333 3037 ], 3038 "name": "United States Virgin Islands", 3039 "code": "VI", 3040 "capital": "Charlotte Amalie" 3041 }, 3042 { 3043 "timezones": [ 3044 "Asia/Ho_Chi_Minh" 3045 ], 3046 "latlng": [ 3047 16.16666666, 3048 107.83333333 3049 ], 3050 "name": "Vietnam", 3051 "code": "VN", 3052 "capital": "Hanoi" 3053 }, 3054 { 3055 "timezones": [ 3056 "Pacific/Efate" 3057 ], 3058 "latlng": [ 3059 -16, 3060 167 3061 ], 3062 "name": "Vanuatu", 3063 "code": "VU", 3064 "capital": "Port Vila" 3065 }, 3066 { 3067 "timezones": [ 3068 "Pacific/Wallis" 3069 ], 3070 "latlng": [ 3071 -13.3, 3072 -176.2 3073 ], 3074 "name": "Wallis and Futuna", 3075 "code": "WF", 3076 "capital": "Mata-Utu" 3077 }, 3078 { 3079 "timezones": [ 3080 "Pacific/Apia" 3081 ], 3082 "latlng": [ 3083 -13.58333333, 3084 -172.33333333 3085 ], 3086 "name": "Samoa", 3087 "code": "WS", 3088 "capital": "Apia" 3089 }, 3090 { 3091 "timezones": [ 3092 "Asia/Aden" 3093 ], 3094 "latlng": [ 3095 15, 3096 48 3097 ], 3098 "name": "Yemen", 3099 "code": "YE", 3100 "capital": "Sana'a" 3101 }, 3102 { 3103 "timezones": [ 3104 "Africa/Johannesburg" 3105 ], 3106 "latlng": [ 3107 -29, 3108 24 3109 ], 3110 "name": "South Africa", 3111 "code": "ZA", 3112 "capital": "Pretoria" 3113 }, 3114 { 3115 "timezones": [ 3116 "Africa/Lusaka" 3117 ], 3118 "latlng": [ 3119 -15, 3120 30 3121 ], 3122 "name": "Zambia", 3123 "code": "ZM", 3124 "capital": "Lusaka" 3125 }, 3126 { 3127 "timezones": [ 3128 "Africa/Harare" 3129 ], 3130 "latlng": [ 3131 -20, 3132 30 3133 ], 3134 "name": "Zimbabwe", 3135 "code": "ZW", 3136 "capital": "Harare" 3137 } 3138 ] 1 [{"timezones":["America/Aruba"],"latlng":[12.5,-69.96666666],"name":"Aruba","code":"AW","capital":"Oranjestad"},{"timezones":["Asia/Kabul"],"latlng":[33,65],"name":"Afghanistan","code":"AF","capital":"Kabul"},{"timezones":["Africa/Luanda"],"latlng":[-12.5,18.5],"name":"Angola","code":"AO","capital":"Luanda"},{"timezones":["America/Anguilla"],"latlng":[18.25,-63.16666666],"name":"Anguilla","code":"AI","capital":"The Valley"},{"timezones":["Europe/Mariehamn"],"latlng":[60.116667,19.9],"name":"\u00c5land Islands","code":"AX","capital":"Mariehamn"},{"timezones":["Europe/Tirane"],"latlng":[41,20],"name":"Albania","code":"AL","capital":"Tirana"},{"timezones":["Europe/Andorra"],"latlng":[42.5,1.5],"name":"Andorra","code":"AD","capital":"Andorra la Vella"},{"timezones":["Asia/Dubai"],"latlng":[24,54],"name":"United Arab Emirates","code":"AE","capital":"Abu Dhabi"},{"timezones":["America/Argentina/Buenos_Aires","America/Argentina/Cordoba","America/Argentina/Salta","America/Argentina/Jujuy","America/Argentina/Tucuman","America/Argentina/Catamarca","America/Argentina/La_Rioja","America/Argentina/San_Juan","America/Argentina/Mendoza","America/Argentina/San_Luis","America/Argentina/Rio_Gallegos","America/Argentina/Ushuaia"],"latlng":[-34,-64],"name":"Argentina","code":"AR","capital":"Buenos Aires"},{"timezones":["Asia/Yerevan"],"latlng":[40,45],"name":"Armenia","code":"AM","capital":"Yerevan"},{"timezones":["Pacific/Pago_Pago"],"latlng":[-14.33333333,-170],"name":"American Samoa","code":"AS","capital":"Pago Pago"},{"timezones":["Antarctica/McMurdo","Antarctica/Casey","Antarctica/Davis","Antarctica/DumontDUrville","Antarctica/Mawson","Antarctica/Palmer","Antarctica/Rothera","Antarctica/Syowa","Antarctica/Troll","Antarctica/Vostok"],"latlng":[-90,0],"name":"Antarctica","code":"AQ","capital":null},{"timezones":["Indian/Kerguelen"],"latlng":[-49.25,69.167],"name":"French Southern and Antarctic Lands","code":"TF","capital":"Port-aux-Fran\u00e7ais"},{"timezones":["America/Antigua"],"latlng":[17.05,-61.8],"name":"Antigua and Barbuda","code":"AG","capital":"Saint John's"},{"timezones":["Australia/Lord_Howe","Antarctica/Macquarie","Australia/Hobart","Australia/Currie","Australia/Melbourne","Australia/Sydney","Australia/Broken_Hill","Australia/Brisbane","Australia/Lindeman","Australia/Adelaide","Australia/Darwin","Australia/Perth","Australia/Eucla"],"latlng":[-27,133],"name":"Australia","code":"AU","capital":"Canberra"},{"timezones":["Europe/Vienna"],"latlng":[47.33333333,13.33333333],"name":"Austria","code":"AT","capital":"Vienna"},{"timezones":["Asia/Baku"],"latlng":[40.5,47.5],"name":"Azerbaijan","code":"AZ","capital":"Baku"},{"timezones":["Africa/Bujumbura"],"latlng":[-3.5,30],"name":"Burundi","code":"BI","capital":"Bujumbura"},{"timezones":["Europe/Brussels"],"latlng":[50.83333333,4],"name":"Belgium","code":"BE","capital":"Brussels"},{"timezones":["Africa/Porto-Novo"],"latlng":[9.5,2.25],"name":"Benin","code":"BJ","capital":"Porto-Novo"},{"timezones":["Africa/Ouagadougou"],"latlng":[13,-2],"name":"Burkina Faso","code":"BF","capital":"Ouagadougou"},{"timezones":["Asia/Dhaka"],"latlng":[24,90],"name":"Bangladesh","code":"BD","capital":"Dhaka"},{"timezones":["Europe/Sofia"],"latlng":[43,25],"name":"Bulgaria","code":"BG","capital":"Sofia"},{"timezones":["Asia/Bahrain"],"latlng":[26,50.55],"name":"Bahrain","code":"BH","capital":"Manama"},{"timezones":["America/Nassau"],"latlng":[24.25,-76],"name":"Bahamas","code":"BS","capital":"Nassau"},{"timezones":["Europe/Sarajevo"],"latlng":[44,18],"name":"Bosnia and Herzegovina","code":"BA","capital":"Sarajevo"},{"timezones":["America/St_Barthelemy"],"latlng":[18.5,-63.41666666],"name":"Saint Barth\u00e9lemy","code":"BL","capital":"Gustavia"},{"timezones":["Europe/Minsk"],"latlng":[53,28],"name":"Belarus","code":"BY","capital":"Minsk"},{"timezones":["America/Belize"],"latlng":[17.25,-88.75],"name":"Belize","code":"BZ","capital":"Belmopan"},{"timezones":["Atlantic/Bermuda"],"latlng":[32.33333333,-64.75],"name":"Bermuda","code":"BM","capital":"Hamilton"},{"timezones":["America/La_Paz"],"latlng":[-17,-65],"name":"Bolivia","code":"BO","capital":"Sucre"},{"timezones":["America/Noronha","America/Belem","America/Fortaleza","America/Recife","America/Araguaina","America/Maceio","America/Bahia","America/Sao_Paulo","America/Campo_Grande","America/Cuiaba","America/Santarem","America/Porto_Velho","America/Boa_Vista","America/Manaus","America/Eirunepe","America/Rio_Branco"],"latlng":[-10,-55],"name":"Brazil","code":"BR","capital":"Bras\u00edlia"},{"timezones":["America/Barbados"],"latlng":[13.16666666,-59.53333333],"name":"Barbados","code":"BB","capital":"Bridgetown"},{"timezones":["Asia/Brunei"],"latlng":[4.5,114.66666666],"name":"Brunei","code":"BN","capital":"Bandar Seri Begawan"},{"timezones":["Asia/Thimphu"],"latlng":[27.5,90.5],"name":"Bhutan","code":"BT","capital":"Thimphu"},{"timezones":["Europe/Oslo"],"latlng":[-54.43333333,3.4],"name":"Bouvet Island","code":"BV","capital":null},{"timezones":["Africa/Gaborone"],"latlng":[-22,24],"name":"Botswana","code":"BW","capital":"Gaborone"},{"timezones":["Africa/Bangui"],"latlng":[7,21],"name":"Central African Republic","code":"CF","capital":"Bangui"},{"timezones":["America/St_Johns","America/Halifax","America/Glace_Bay","America/Moncton","America/Goose_Bay","America/Blanc-Sablon","America/Toronto","America/Nipigon","America/Thunder_Bay","America/Iqaluit","America/Pangnirtung","America/Atikokan","America/Winnipeg","America/Rainy_River","America/Resolute","America/Rankin_Inlet","America/Regina","America/Swift_Current","America/Edmonton","America/Cambridge_Bay","America/Yellowknife","America/Inuvik","America/Creston","America/Dawson_Creek","America/Fort_Nelson","America/Vancouver","America/Whitehorse","America/Dawson"],"latlng":[60,-95],"name":"Canada","code":"CA","capital":"Ottawa"},{"timezones":["Indian/Cocos"],"latlng":[-12.5,96.83333333],"name":"Cocos (Keeling) Islands","code":"CC","capital":"West Island"},{"timezones":["Europe/Zurich"],"latlng":[47,8],"name":"Switzerland","code":"CH","capital":"Bern"},{"timezones":["America/Santiago","Pacific/Easter"],"latlng":[-30,-71],"name":"Chile","code":"CL","capital":"Santiago"},{"timezones":["Asia/Shanghai","Asia/Urumqi"],"latlng":[35,105],"name":"China","code":"CN","capital":"Beijing"},{"timezones":["Africa/Abidjan"],"latlng":[8,-5],"name":"Ivory Coast","code":"CI","capital":"Yamoussoukro"},{"timezones":["Africa/Douala"],"latlng":[6,12],"name":"Cameroon","code":"CM","capital":"Yaound\u00e9"},{"timezones":["Africa/Kinshasa","Africa/Lubumbashi"],"latlng":[0,25],"name":"DR Congo","code":"CD","capital":"Kinshasa"},{"timezones":["Africa/Brazzaville"],"latlng":[-1,15],"name":"Republic of the Congo","code":"CG","capital":"Brazzaville"},{"timezones":["Pacific/Rarotonga"],"latlng":[-21.23333333,-159.76666666],"name":"Cook Islands","code":"CK","capital":"Avarua"},{"timezones":["America/Bogota"],"latlng":[4,-72],"name":"Colombia","code":"CO","capital":"Bogot\u00e1"},{"timezones":["Indian/Comoro"],"latlng":[-12.16666666,44.25],"name":"Comoros","code":"KM","capital":"Moroni"},{"timezones":["Atlantic/Cape_Verde"],"latlng":[16,-24],"name":"Cape Verde","code":"CV","capital":"Praia"},{"timezones":["America/Costa_Rica"],"latlng":[10,-84],"name":"Costa Rica","code":"CR","capital":"San Jos\u00e9"},{"timezones":["America/Havana"],"latlng":[21.5,-80],"name":"Cuba","code":"CU","capital":"Havana"},{"timezones":["America/Curacao"],"latlng":[12.116667,-68.933333],"name":"Cura\u00e7ao","code":"CW","capital":"Willemstad"},{"timezones":["Indian/Christmas"],"latlng":[-10.5,105.66666666],"name":"Christmas Island","code":"CX","capital":"Flying Fish Cove"},{"timezones":["America/Cayman"],"latlng":[19.5,-80.5],"name":"Cayman Islands","code":"KY","capital":"George Town"},{"timezones":["Asia/Nicosia"],"latlng":[35,33],"name":"Cyprus","code":"CY","capital":"Nicosia"},{"timezones":["Europe/Prague"],"latlng":[49.75,15.5],"name":"Czech Republic","code":"CZ","capital":"Prague"},{"timezones":["Europe/Berlin","Europe/Busingen"],"latlng":[51,9],"name":"Germany","code":"DE","capital":"Berlin"},{"timezones":["Africa/Djibouti"],"latlng":[11.5,43],"name":"Djibouti","code":"DJ","capital":"Djibouti"},{"timezones":["America/Dominica"],"latlng":[15.41666666,-61.33333333],"name":"Dominica","code":"DM","capital":"Roseau"},{"timezones":["Europe/Copenhagen"],"latlng":[56,10],"name":"Denmark","code":"DK","capital":"Copenhagen"},{"timezones":["America/Santo_Domingo"],"latlng":[19,-70.66666666],"name":"Dominican Republic","code":"DO","capital":"Santo Domingo"},{"timezones":["Africa/Algiers"],"latlng":[28,3],"name":"Algeria","code":"DZ","capital":"Algiers"},{"timezones":["America/Guayaquil","Pacific/Galapagos"],"latlng":[-2,-77.5],"name":"Ecuador","code":"EC","capital":"Quito"},{"timezones":["Africa/Cairo"],"latlng":[27,30],"name":"Egypt","code":"EG","capital":"Cairo"},{"timezones":["Africa/Asmara"],"latlng":[15,39],"name":"Eritrea","code":"ER","capital":"Asmara"},{"timezones":["Africa/El_Aaiun"],"latlng":[24.5,-13],"name":"Western Sahara","code":"EH","capital":"El Aai\u00fan"},{"timezones":["Europe/Madrid","Africa/Ceuta","Atlantic/Canary"],"latlng":[40,-4],"name":"Spain","code":"ES","capital":"Madrid"},{"timezones":["Europe/Tallinn"],"latlng":[59,26],"name":"Estonia","code":"EE","capital":"Tallinn"},{"timezones":["Africa/Addis_Ababa"],"latlng":[8,38],"name":"Ethiopia","code":"ET","capital":"Addis Ababa"},{"timezones":["Europe/Helsinki"],"latlng":[64,26],"name":"Finland","code":"FI","capital":"Helsinki"},{"timezones":["Pacific/Fiji"],"latlng":[-18,175],"name":"Fiji","code":"FJ","capital":"Suva"},{"timezones":["Atlantic/Stanley"],"latlng":[-51.75,-59],"name":"Falkland Islands","code":"FK","capital":"Stanley"},{"timezones":["Europe/Paris"],"latlng":[46,2],"name":"France","code":"FR","capital":"Paris"},{"timezones":["Atlantic/Faroe"],"latlng":[62,-7],"name":"Faroe Islands","code":"FO","capital":"T\u00f3rshavn"},{"timezones":["Pacific/Chuuk","Pacific/Pohnpei","Pacific/Kosrae"],"latlng":[6.91666666,158.25],"name":"Micronesia","code":"FM","capital":"Palikir"},{"timezones":["Africa/Libreville"],"latlng":[-1,11.75],"name":"Gabon","code":"GA","capital":"Libreville"},{"timezones":["Europe/London"],"latlng":[54,-2],"name":"United Kingdom","code":"GB","capital":"London"},{"timezones":["Asia/Tbilisi"],"latlng":[42,43.5],"name":"Georgia","code":"GE","capital":"Tbilisi"},{"timezones":["Europe/Guernsey"],"latlng":[49.46666666,-2.58333333],"name":"Guernsey","code":"GG","capital":"St. Peter Port"},{"timezones":["Africa/Accra"],"latlng":[8,-2],"name":"Ghana","code":"GH","capital":"Accra"},{"timezones":["Europe/Gibraltar"],"latlng":[36.13333333,-5.35],"name":"Gibraltar","code":"GI","capital":"Gibraltar"},{"timezones":["Africa/Conakry"],"latlng":[11,-10],"name":"Guinea","code":"GN","capital":"Conakry"},{"timezones":["America/Guadeloupe"],"latlng":[16.25,-61.583333],"name":"Guadeloupe","code":"GP","capital":"Basse-Terre"},{"timezones":["Africa/Banjul"],"latlng":[13.46666666,-16.56666666],"name":"Gambia","code":"GM","capital":"Banjul"},{"timezones":["Africa/Bissau"],"latlng":[12,-15],"name":"Guinea-Bissau","code":"GW","capital":"Bissau"},{"timezones":["Africa/Malabo"],"latlng":[2,10],"name":"Equatorial Guinea","code":"GQ","capital":"Malabo"},{"timezones":["Europe/Athens"],"latlng":[39,22],"name":"Greece","code":"GR","capital":"Athens"},{"timezones":["America/Grenada"],"latlng":[12.11666666,-61.66666666],"name":"Grenada","code":"GD","capital":"St. George's"},{"timezones":["America/Godthab","America/Danmarkshavn","America/Scoresbysund","America/Thule"],"latlng":[72,-40],"name":"Greenland","code":"GL","capital":"Nuuk"},{"timezones":["America/Guatemala"],"latlng":[15.5,-90.25],"name":"Guatemala","code":"GT","capital":"Guatemala City"},{"timezones":["America/Cayenne"],"latlng":[4,-53],"name":"French Guiana","code":"GF","capital":"Cayenne"},{"timezones":["Pacific/Guam"],"latlng":[13.46666666,144.78333333],"name":"Guam","code":"GU","capital":"Hag\u00e5t\u00f1a"},{"timezones":["America/Guyana"],"latlng":[5,-59],"name":"Guyana","code":"GY","capital":"Georgetown"},{"timezones":["Asia/Hong_Kong"],"latlng":[22.267,114.188],"name":"Hong Kong","code":"HK","capital":"City of Victoria"},{"timezones":["America/Tegucigalpa"],"latlng":[15,-86.5],"name":"Honduras","code":"HN","capital":"Tegucigalpa"},{"timezones":["Europe/Zagreb"],"latlng":[45.16666666,15.5],"name":"Croatia","code":"HR","capital":"Zagreb"},{"timezones":["America/Port-au-Prince"],"latlng":[19,-72.41666666],"name":"Haiti","code":"HT","capital":"Port-au-Prince"},{"timezones":["Europe/Budapest"],"latlng":[47,20],"name":"Hungary","code":"HU","capital":"Budapest"},{"timezones":["Asia/Jakarta","Asia/Pontianak","Asia/Makassar","Asia/Jayapura"],"latlng":[-5,120],"name":"Indonesia","code":"ID","capital":"Jakarta"},{"timezones":["Europe/Isle_of_Man"],"latlng":[54.25,-4.5],"name":"Isle of Man","code":"IM","capital":"Douglas"},{"timezones":["Asia/Kolkata"],"latlng":[20,77],"name":"India","code":"IN","capital":"New Delhi"},{"timezones":["Indian/Chagos"],"latlng":[-6,71.5],"name":"British Indian Ocean Territory","code":"IO","capital":"Diego Garcia"},{"timezones":["Europe/Dublin"],"latlng":[53,-8],"name":"Ireland","code":"IE","capital":"Dublin"},{"timezones":["Asia/Tehran"],"latlng":[32,53],"name":"Iran","code":"IR","capital":"Tehran"},{"timezones":["Asia/Baghdad"],"latlng":[33,44],"name":"Iraq","code":"IQ","capital":"Baghdad"},{"timezones":["Atlantic/Reykjavik"],"latlng":[65,-18],"name":"Iceland","code":"IS","capital":"Reykjavik"},{"timezones":["Asia/Jerusalem"],"latlng":[31.47,35.13],"name":"Israel","code":"IL","capital":"Jerusalem"},{"timezones":["Europe/Rome"],"latlng":[42.83333333,12.83333333],"name":"Italy","code":"IT","capital":"Rome"},{"timezones":["America/Jamaica"],"latlng":[18.25,-77.5],"name":"Jamaica","code":"JM","capital":"Kingston"},{"timezones":["Europe/Jersey"],"latlng":[49.25,-2.16666666],"name":"Jersey","code":"JE","capital":"Saint Helier"},{"timezones":["Asia/Amman"],"latlng":[31,36],"name":"Jordan","code":"JO","capital":"Amman"},{"timezones":["Asia/Tokyo"],"latlng":[36,138],"name":"Japan","code":"JP","capital":"Tokyo"},{"timezones":["Asia/Almaty","Asia/Qyzylorda","Asia/Aqtobe","Asia/Aqtau","Asia/Oral"],"latlng":[48,68],"name":"Kazakhstan","code":"KZ","capital":"Astana"},{"timezones":["Africa/Nairobi"],"latlng":[1,38],"name":"Kenya","code":"KE","capital":"Nairobi"},{"timezones":["Asia/Bishkek"],"latlng":[41,75],"name":"Kyrgyzstan","code":"KG","capital":"Bishkek"},{"timezones":["Asia/Phnom_Penh"],"latlng":[13,105],"name":"Cambodia","code":"KH","capital":"Phnom Penh"},{"timezones":["Pacific/Tarawa","Pacific/Enderbury","Pacific/Kiritimati"],"latlng":[1.41666666,173],"name":"Kiribati","code":"KI","capital":"South Tarawa"},{"timezones":["America/St_Kitts"],"latlng":[17.33333333,-62.75],"name":"Saint Kitts and Nevis","code":"KN","capital":"Basseterre"},{"timezones":["Asia/Seoul"],"latlng":[37,127.5],"name":"South Korea","code":"KR","capital":"Seoul"},{"timezones":["Europe/Belgrade"],"latlng":[42.666667,21.166667],"name":"Kosovo","code":"XK","capital":"Pristina"},{"timezones":["Asia/Kuwait"],"latlng":[29.5,45.75],"name":"Kuwait","code":"KW","capital":"Kuwait City"},{"timezones":["Asia/Vientiane"],"latlng":[18,105],"name":"Laos","code":"LA","capital":"Vientiane"},{"timezones":["Asia/Beirut"],"latlng":[33.83333333,35.83333333],"name":"Lebanon","code":"LB","capital":"Beirut"},{"timezones":["Africa/Monrovia"],"latlng":[6.5,-9.5],"name":"Liberia","code":"LR","capital":"Monrovia"},{"timezones":["Africa/Tripoli"],"latlng":[25,17],"name":"Libya","code":"LY","capital":"Tripoli"},{"timezones":["America/St_Lucia"],"latlng":[13.88333333,-60.96666666],"name":"Saint Lucia","code":"LC","capital":"Castries"},{"timezones":["Europe/Vaduz"],"latlng":[47.26666666,9.53333333],"name":"Liechtenstein","code":"LI","capital":"Vaduz"},{"timezones":["Asia/Colombo"],"latlng":[7,81],"name":"Sri Lanka","code":"LK","capital":"Colombo"},{"timezones":["Africa/Maseru"],"latlng":[-29.5,28.5],"name":"Lesotho","code":"LS","capital":"Maseru"},{"timezones":["Europe/Vilnius"],"latlng":[56,24],"name":"Lithuania","code":"LT","capital":"Vilnius"},{"timezones":["Europe/Luxembourg"],"latlng":[49.75,6.16666666],"name":"Luxembourg","code":"LU","capital":"Luxembourg"},{"timezones":["Europe/Riga"],"latlng":[57,25],"name":"Latvia","code":"LV","capital":"Riga"},{"timezones":["Asia/Macau"],"latlng":[22.16666666,113.55],"name":"Macau","code":"MO","capital":null},{"timezones":["America/Marigot"],"latlng":[18.08333333,-63.95],"name":"Saint Martin","code":"MF","capital":"Marigot"},{"timezones":["Africa/Casablanca"],"latlng":[32,-5],"name":"Morocco","code":"MA","capital":"Rabat"},{"timezones":["Europe/Monaco"],"latlng":[43.73333333,7.4],"name":"Monaco","code":"MC","capital":"Monaco"},{"timezones":["Europe/Chisinau"],"latlng":[47,29],"name":"Moldova","code":"MD","capital":"Chi\u0219in\u0103u"},{"timezones":["Indian/Antananarivo"],"latlng":[-20,47],"name":"Madagascar","code":"MG","capital":"Antananarivo"},{"timezones":["Indian/Maldives"],"latlng":[3.25,73],"name":"Maldives","code":"MV","capital":"Mal\u00e9"},{"timezones":["America/Mexico_City","America/Cancun","America/Merida","America/Monterrey","America/Matamoros","America/Mazatlan","America/Chihuahua","America/Ojinaga","America/Hermosillo","America/Tijuana","America/Bahia_Banderas"],"latlng":[23,-102],"name":"Mexico","code":"MX","capital":"Mexico City"},{"timezones":["Pacific/Majuro","Pacific/Kwajalein"],"latlng":[9,168],"name":"Marshall Islands","code":"MH","capital":"Majuro"},{"timezones":["Europe/Skopje"],"latlng":[41.83333333,22],"name":"Macedonia","code":"MK","capital":"Skopje"},{"timezones":["Africa/Bamako"],"latlng":[17,-4],"name":"Mali","code":"ML","capital":"Bamako"},{"timezones":["Europe/Malta"],"latlng":[35.83333333,14.58333333],"name":"Malta","code":"MT","capital":"Valletta"},{"timezones":["Asia/Rangoon"],"latlng":[22,98],"name":"Myanmar","code":"MM","capital":"Naypyidaw"},{"timezones":["Europe/Podgorica"],"latlng":[42.5,19.3],"name":"Montenegro","code":"ME","capital":"Podgorica"},{"timezones":["Asia/Ulaanbaatar","Asia/Hovd","Asia/Choibalsan"],"latlng":[46,105],"name":"Mongolia","code":"MN","capital":"Ulan Bator"},{"timezones":["Pacific/Saipan"],"latlng":[15.2,145.75],"name":"Northern Mariana Islands","code":"MP","capital":"Saipan"},{"timezones":["Africa/Maputo"],"latlng":[-18.25,35],"name":"Mozambique","code":"MZ","capital":"Maputo"},{"timezones":["Africa/Nouakchott"],"latlng":[20,-12],"name":"Mauritania","code":"MR","capital":"Nouakchott"},{"timezones":["America/Montserrat"],"latlng":[16.75,-62.2],"name":"Montserrat","code":"MS","capital":"Plymouth"},{"timezones":["America/Martinique"],"latlng":[14.666667,-61],"name":"Martinique","code":"MQ","capital":"Fort-de-France"},{"timezones":["Indian/Mauritius"],"latlng":[-20.28333333,57.55],"name":"Mauritius","code":"MU","capital":"Port Louis"},{"timezones":["Africa/Blantyre"],"latlng":[-13.5,34],"name":"Malawi","code":"MW","capital":"Lilongwe"},{"timezones":["Asia/Kuala_Lumpur","Asia/Kuching"],"latlng":[2.5,112.5],"name":"Malaysia","code":"MY","capital":"Kuala Lumpur"},{"timezones":["Indian/Mayotte"],"latlng":[-12.83333333,45.16666666],"name":"Mayotte","code":"YT","capital":"Mamoudzou"},{"timezones":["Africa/Windhoek"],"latlng":[-22,17],"name":"Namibia","code":"NA","capital":"Windhoek"},{"timezones":["Pacific/Noumea"],"latlng":[-21.5,165.5],"name":"New Caledonia","code":"NC","capital":"Noum\u00e9a"},{"timezones":["Africa/Niamey"],"latlng":[16,8],"name":"Niger","code":"NE","capital":"Niamey"},{"timezones":["Pacific/Norfolk"],"latlng":[-29.03333333,167.95],"name":"Norfolk Island","code":"NF","capital":"Kingston"},{"timezones":["Africa/Lagos"],"latlng":[10,8],"name":"Nigeria","code":"NG","capital":"Abuja"},{"timezones":["America/Managua"],"latlng":[13,-85],"name":"Nicaragua","code":"NI","capital":"Managua"},{"timezones":["Pacific/Niue"],"latlng":[-19.03333333,-169.86666666],"name":"Niue","code":"NU","capital":"Alofi"},{"timezones":["Europe/Amsterdam"],"latlng":[52.5,5.75],"name":"Netherlands","code":"NL","capital":"Amsterdam"},{"timezones":["Europe/Oslo"],"latlng":[62,10],"name":"Norway","code":"NO","capital":"Oslo"},{"timezones":["Asia/Kathmandu"],"latlng":[28,84],"name":"Nepal","code":"NP","capital":"Kathmandu"},{"timezones":["Pacific/Nauru"],"latlng":[-0.53333333,166.91666666],"name":"Nauru","code":"NR","capital":"Yaren"},{"timezones":["Pacific/Auckland","Pacific/Chatham"],"latlng":[-41,174],"name":"New Zealand","code":"NZ","capital":"Wellington"},{"timezones":["Asia/Muscat"],"latlng":[21,57],"name":"Oman","code":"OM","capital":"Muscat"},{"timezones":["Asia/Karachi"],"latlng":[30,70],"name":"Pakistan","code":"PK","capital":"Islamabad"},{"timezones":["America/Panama"],"latlng":[9,-80],"name":"Panama","code":"PA","capital":"Panama City"},{"timezones":["Pacific/Pitcairn"],"latlng":[-25.06666666,-130.1],"name":"Pitcairn Islands","code":"PN","capital":"Adamstown"},{"timezones":["America/Lima"],"latlng":[-10,-76],"name":"Peru","code":"PE","capital":"Lima"},{"timezones":["Asia/Manila"],"latlng":[13,122],"name":"Philippines","code":"PH","capital":"Manila"},{"timezones":["Pacific/Palau"],"latlng":[7.5,134.5],"name":"Palau","code":"PW","capital":"Ngerulmud"},{"timezones":["Pacific/Port_Moresby","Pacific/Bougainville"],"latlng":[-6,147],"name":"Papua New Guinea","code":"PG","capital":"Port Moresby"},{"timezones":["Europe/Warsaw"],"latlng":[52,20],"name":"Poland","code":"PL","capital":"Warsaw"},{"timezones":["America/Puerto_Rico"],"latlng":[18.25,-66.5],"name":"Puerto Rico","code":"PR","capital":"San Juan"},{"timezones":["Asia/Pyongyang"],"latlng":[40,127],"name":"North Korea","code":"KP","capital":"Pyongyang"},{"timezones":["Europe/Lisbon","Atlantic/Madeira","Atlantic/Azores"],"latlng":[39.5,-8],"name":"Portugal","code":"PT","capital":"Lisbon"},{"timezones":["America/Asuncion"],"latlng":[-23,-58],"name":"Paraguay","code":"PY","capital":"Asunci\u00f3n"},{"timezones":["Asia/Gaza","Asia/Hebron"],"latlng":[31.9,35.2],"name":"Palestine","code":"PS","capital":"Ramallah"},{"timezones":["Pacific/Tahiti","Pacific/Marquesas","Pacific/Gambier"],"latlng":[-15,-140],"name":"French Polynesia","code":"PF","capital":"Papeet\u0113"},{"timezones":["Asia/Qatar"],"latlng":[25.5,51.25],"name":"Qatar","code":"QA","capital":"Doha"},{"timezones":["Indian/Reunion"],"latlng":[-21.15,55.5],"name":"R\u00e9union","code":"RE","capital":"Saint-Denis"},{"timezones":["Europe/Bucharest"],"latlng":[46,25],"name":"Romania","code":"RO","capital":"Bucharest"},{"timezones":["Europe/Kaliningrad","Europe/Moscow","Europe/Simferopol","Europe/Volgograd","Europe/Kirov","Europe/Astrakhan","Europe/Samara","Europe/Ulyanovsk","Asia/Yekaterinburg","Asia/Omsk","Asia/Novosibirsk","Asia/Barnaul","Asia/Tomsk","Asia/Novokuznetsk","Asia/Krasnoyarsk","Asia/Irkutsk","Asia/Chita","Asia/Yakutsk","Asia/Khandyga","Asia/Vladivostok","Asia/Ust-Nera","Asia/Magadan","Asia/Sakhalin","Asia/Srednekolymsk","Asia/Kamchatka","Asia/Anadyr"],"latlng":[60,100],"name":"Russia","code":"RU","capital":"Moscow"},{"timezones":["Africa/Kigali"],"latlng":[-2,30],"name":"Rwanda","code":"RW","capital":"Kigali"},{"timezones":["Asia/Riyadh"],"latlng":[25,45],"name":"Saudi Arabia","code":"SA","capital":"Riyadh"},{"timezones":["Africa/Khartoum"],"latlng":[15,30],"name":"Sudan","code":"SD","capital":"Khartoum"},{"timezones":["Africa/Dakar"],"latlng":[14,-14],"name":"Senegal","code":"SN","capital":"Dakar"},{"timezones":["Asia/Singapore"],"latlng":[1.36666666,103.8],"name":"Singapore","code":"SG","capital":"Singapore"},{"timezones":["Atlantic/South_Georgia"],"latlng":[-54.5,-37],"name":"South Georgia","code":"GS","capital":"King Edward Point"},{"timezones":["Arctic/Longyearbyen"],"latlng":[78,20],"name":"Svalbard and Jan Mayen","code":"SJ","capital":"Longyearbyen"},{"timezones":["Pacific/Guadalcanal"],"latlng":[-8,159],"name":"Solomon Islands","code":"SB","capital":"Honiara"},{"timezones":["Africa/Freetown"],"latlng":[8.5,-11.5],"name":"Sierra Leone","code":"SL","capital":"Freetown"},{"timezones":["America/El_Salvador"],"latlng":[13.83333333,-88.91666666],"name":"El Salvador","code":"SV","capital":"San Salvador"},{"timezones":["Europe/San_Marino"],"latlng":[43.76666666,12.41666666],"name":"San Marino","code":"SM","capital":"City of San Marino"},{"timezones":["Africa/Mogadishu"],"latlng":[10,49],"name":"Somalia","code":"SO","capital":"Mogadishu"},{"timezones":["America/Miquelon"],"latlng":[46.83333333,-56.33333333],"name":"Saint Pierre and Miquelon","code":"PM","capital":"Saint-Pierre"},{"timezones":["Europe/Belgrade"],"latlng":[44,21],"name":"Serbia","code":"RS","capital":"Belgrade"},{"timezones":["Africa/Juba"],"latlng":[7,30],"name":"South Sudan","code":"SS","capital":"Juba"},{"timezones":["Africa/Sao_Tome"],"latlng":[1,7],"name":"S\u00e3o Tom\u00e9 and Pr\u00edncipe","code":"ST","capital":"S\u00e3o Tom\u00e9"},{"timezones":["America/Paramaribo"],"latlng":[4,-56],"name":"Suriname","code":"SR","capital":"Paramaribo"},{"timezones":["Europe/Bratislava"],"latlng":[48.66666666,19.5],"name":"Slovakia","code":"SK","capital":"Bratislava"},{"timezones":["Europe/Ljubljana"],"latlng":[46.11666666,14.81666666],"name":"Slovenia","code":"SI","capital":"Ljubljana"},{"timezones":["Europe/Stockholm"],"latlng":[62,15],"name":"Sweden","code":"SE","capital":"Stockholm"},{"timezones":["Africa/Mbabane"],"latlng":[-26.5,31.5],"name":"Swaziland","code":"SZ","capital":"Lobamba"},{"timezones":["America/Lower_Princes"],"latlng":[18.033333,-63.05],"name":"Sint Maarten","code":"SX","capital":"Philipsburg"},{"timezones":["Indian/Mahe"],"latlng":[-4.58333333,55.66666666],"name":"Seychelles","code":"SC","capital":"Victoria"},{"timezones":["Asia/Damascus"],"latlng":[35,38],"name":"Syria","code":"SY","capital":"Damascus"},{"timezones":["America/Grand_Turk"],"latlng":[21.75,-71.58333333],"name":"Turks and Caicos Islands","code":"TC","capital":"Cockburn Town"},{"timezones":["Africa/Ndjamena"],"latlng":[15,19],"name":"Chad","code":"TD","capital":"N'Djamena"},{"timezones":["Africa/Lome"],"latlng":[8,1.16666666],"name":"Togo","code":"TG","capital":"Lom\u00e9"},{"timezones":["Asia/Bangkok"],"latlng":[15,100],"name":"Thailand","code":"TH","capital":"Bangkok"},{"timezones":["Asia/Dushanbe"],"latlng":[39,71],"name":"Tajikistan","code":"TJ","capital":"Dushanbe"},{"timezones":["Pacific/Fakaofo"],"latlng":[-9,-172],"name":"Tokelau","code":"TK","capital":"Fakaofo"},{"timezones":["Asia/Ashgabat"],"latlng":[40,60],"name":"Turkmenistan","code":"TM","capital":"Ashgabat"},{"timezones":["Asia/Dili"],"latlng":[-8.83333333,125.91666666],"name":"Timor-Leste","code":"TL","capital":"Dili"},{"timezones":["Pacific/Tongatapu"],"latlng":[-20,-175],"name":"Tonga","code":"TO","capital":"Nuku'alofa"},{"timezones":["America/Port_of_Spain"],"latlng":[11,-61],"name":"Trinidad and Tobago","code":"TT","capital":"Port of Spain"},{"timezones":["Africa/Tunis"],"latlng":[34,9],"name":"Tunisia","code":"TN","capital":"Tunis"},{"timezones":["Europe/Istanbul"],"latlng":[39,35],"name":"Turkey","code":"TR","capital":"Ankara"},{"timezones":["Pacific/Funafuti"],"latlng":[-8,178],"name":"Tuvalu","code":"TV","capital":"Funafuti"},{"timezones":["Asia/Taipei"],"latlng":[23.5,121],"name":"Taiwan","code":"TW","capital":"Taipei"},{"timezones":["Africa/Dar_es_Salaam"],"latlng":[-6,35],"name":"Tanzania","code":"TZ","capital":"Dodoma"},{"timezones":["Africa/Kampala"],"latlng":[1,32],"name":"Uganda","code":"UG","capital":"Kampala"},{"timezones":["Europe/Kiev","Europe/Uzhgorod","Europe/Zaporozhye"],"latlng":[49,32],"name":"Ukraine","code":"UA","capital":"Kiev"},{"timezones":["Pacific/Johnston","Pacific/Midway","Pacific/Wake"],"latlng":[19.2911437,166.618332],"name":"United States Minor Outlying Islands","code":"UM","capital":null},{"timezones":["America/Montevideo"],"latlng":[-33,-56],"name":"Uruguay","code":"UY","capital":"Montevideo"},{"timezones":["America/New_York","America/Detroit","America/Kentucky/Louisville","America/Kentucky/Monticello","America/Indiana/Indianapolis","America/Indiana/Vincennes","America/Indiana/Winamac","America/Indiana/Marengo","America/Indiana/Petersburg","America/Indiana/Vevay","America/Chicago","America/Indiana/Tell_City","America/Indiana/Knox","America/Menominee","America/North_Dakota/Center","America/North_Dakota/New_Salem","America/North_Dakota/Beulah","America/Denver","America/Boise","America/Phoenix","America/Los_Angeles","America/Anchorage","America/Juneau","America/Sitka","America/Metlakatla","America/Yakutat","America/Nome","America/Adak","Pacific/Honolulu"],"latlng":[38,-97],"name":"United States","code":"US","capital":"Washington D.C."},{"timezones":["Asia/Samarkand","Asia/Tashkent"],"latlng":[41,64],"name":"Uzbekistan","code":"UZ","capital":"Tashkent"},{"timezones":["Europe/Vatican"],"latlng":[41.9,12.45],"name":"Vatican City","code":"VA","capital":"Vatican City"},{"timezones":["America/St_Vincent"],"latlng":[13.25,-61.2],"name":"Saint Vincent and the Grenadines","code":"VC","capital":"Kingstown"},{"timezones":["America/Caracas"],"latlng":[8,-66],"name":"Venezuela","code":"VE","capital":"Caracas"},{"timezones":["America/Tortola"],"latlng":[18.431383,-64.62305],"name":"British Virgin Islands","code":"VG","capital":"Road Town"},{"timezones":["America/St_Thomas"],"latlng":[18.35,-64.933333],"name":"United States Virgin Islands","code":"VI","capital":"Charlotte Amalie"},{"timezones":["Asia/Ho_Chi_Minh"],"latlng":[16.16666666,107.83333333],"name":"Vietnam","code":"VN","capital":"Hanoi"},{"timezones":["Pacific/Efate"],"latlng":[-16,167],"name":"Vanuatu","code":"VU","capital":"Port Vila"},{"timezones":["Pacific/Wallis"],"latlng":[-13.3,-176.2],"name":"Wallis and Futuna","code":"WF","capital":"Mata-Utu"},{"timezones":["Pacific/Apia"],"latlng":[-13.58333333,-172.33333333],"name":"Samoa","code":"WS","capital":"Apia"},{"timezones":["Asia/Aden"],"latlng":[15,48],"name":"Yemen","code":"YE","capital":"Sana'a"},{"timezones":["Africa/Johannesburg"],"latlng":[-29,24],"name":"South Africa","code":"ZA","capital":"Pretoria"},{"timezones":["Africa/Lusaka"],"latlng":[-15,30],"name":"Zambia","code":"ZM","capital":"Lusaka"},{"timezones":["Africa/Harare"],"latlng":[-20,30],"name":"Zimbabwe","code":"ZW","capital":"Harare"}] -
heimdall/trunk/addons/world-map/world-map.php
r2571934 r2834688 1 1 <?php 2 2 3 /** 4 * MIT License <https://github.com/Rmanaf/wp-heimdall/blob/master/LICENSE> 5 * Copyright (c) 2018 Arman Afzal <rman.afzal@gmail.com> 6 */ 3 namespace Heimdall\Addons; 7 4 8 require_once __DIR__ . "/database.php"; 5 use Heimdall\Addon; 6 use Heimdall\Dashboard; 7 use Heimdall\Database; 9 8 10 if (!class_exists('WP_HeimdallAddon_WorldMap')) { 9 class WorldMap extends Addon 10 { 11 11 12 class WP_HeimdallAddon_WorldMap 13 { 14 15 // addon slug 16 private static $slug = "world-map"; 12 private static $service = "http://geolocation-db.com/"; 17 13 18 14 19 private static $service = "http://geolocation-db.com/"; 15 /** 16 * @since 1.3.1 17 */ 18 static function setup() 19 { 20 self::load_libs(["world-map-database.php"]); 21 22 WorldMapDatabase::check_countries_table(); 23 24 WorldMapDatabase::check_ip_table(); 25 26 add_action("admin_enqueue_scripts", [__CLASS__, "admin_enqueue_scripts"]); 27 add_action("wp_ajax_heimdall_world_map", [__CLASS__, "get_dashboard_world_map_data"]); 28 29 add_filter("heimdall__core_record-metadata-v2", [__CLASS__, "add_country_data"]); 30 add_filter("heimdall__core_localize-script", [__CLASS__, "map_data_url"], 10, 1); 31 add_filter("heimdall__widget_tabs", [__CLASS__, "widget_tabs"]); 32 add_filter("heimdall__widget_content", [__CLASS__, "widget_content"]); 33 add_filter("heimdall__com_handle-request" , [__CLASS__, "handle_com_request"]); 34 35 add_filter('heimdall__core_uninstall-options' , function($options){ 36 $options[] = 'world_map_ip_table_db_version'; 37 $options[] = 'world_map_countries_table_db_version'; 38 return $options; 39 }); 40 } 20 41 21 42 22 /** 23 * @since 1.3.1 24 */ 25 static function init() 26 { 27 28 $class = get_called_class(); 29 30 WP_HeimdallAddon_WorldMap_Database::check_countries_table(); 31 32 WP_HeimdallAddon_WorldMap_Database::check_ip_table(); 33 34 add_action("admin_enqueue_scripts", "$class::admin_enqueue_scripts"); 35 36 add_action("heimdall--dashboard-statistic-widget-tabs", "$class::dashboard_statistic_widget_tabs", 10); 37 38 add_action("heimdall--dashboard-statistic-widget-tab-content", "$class::dashboard_statistic_widget_tab_content", 10); 39 40 //add_filter("heimdall--localize-script", "$class::get_dashboard_world_map_data" , 10, 1); 41 42 add_action("wp_ajax_heimdall_world_map" , "$class::get_dashboard_world_map_data"); 43 44 add_filter("heimdall--record-metadata", "$class::add_country_data"); 45 46 } 43 static function map_data_url($data) 44 { 45 $data['worldMapDataURL'] = HEIMDALL_URL . '/addons/world-map/assets/countries-50m.json'; 46 return $data; 47 } 47 48 48 49 49 /** 50 * @since 1.3.1 51 */ 52 static function dashboard_statistic_widget() 53 { 54 } 55 56 57 /** 58 * @since 1.3.1 59 */ 60 static function dashboard_statistic_widget_tabs() { 61 62 WP_Heimdall_Dashboard::create_admin_widget_tab( esc_html__( "Countries", "heimdall" ) ,"countries"); 63 64 } 65 66 /** 67 * @since 1.3.1 68 */ 69 static function dashboard_statistic_widget_tab_content($title){ 70 71 $image = WP_Heimdall_Plugin::addon_url(self::$slug, "assets/img/map.svg"); 72 73 ob_start(); 74 75 ?> 76 77 <div id="statisticsWorldMapDataContainer" style="position: relative;"> 78 <svg width="100%" height="400px"></svg> 79 <div class="tooltip"></div> 80 </div> 81 82 <?php 83 84 WP_Heimdall_Dashboard::create_admin_widget_tab_content("countries" , ob_get_clean() ); 85 } 50 static function widget_tabs($tabs_html) 51 { 52 return $tabs_html . Dashboard::create_widget_tab( 53 self::get_slug(), 54 esc_html__("Countries", "heimdall"), 55 'admin-site-alt3' 56 ); 57 } 86 58 87 59 88 /** 89 * @since 1.3.1 90 */ 91 static function admin_enqueue_scripts(){ 60 static function widget_content($tabs_html) 61 { 62 return $tabs_html . Dashboard::create_widget_tab_content( 63 self::get_slug(), 64 '<canvas id="statisticsWorldMapDataContainer" ></canvas>' 65 ); 66 } 92 67 93 $screen = get_current_screen();94 68 95 if(current_user_can( 'administrator' ) && $screen->id == 'dashboard' ) 96 { 97 98 wp_enqueue_style("world-map", WP_Heimdall_Plugin::addon_url(self::$slug , '/assets/css/world-map-admin.css'), [], WP_Heimdall_Plugin::$version, "all"); 99 100 wp_enqueue_script("topojson", WP_Heimdall_Plugin::addon_url(self::$slug , '/assets/js/topojson.min.js'), ['d3'], WP_Heimdall_Plugin::$version, true); 101 102 wp_enqueue_script("world-map-2", WP_Heimdall_Plugin::addon_url(self::$slug , '/assets/js/world-map-admin.js'), ['d3' , 'topojson'], WP_Heimdall_Plugin::$version, true); 103 104 } 105 69 /** 70 * @since 1.3.1 71 */ 72 static function admin_enqueue_scripts() 73 { 74 $screen = get_current_screen(); 75 if (!current_user_can('update_core') || $screen->id !== 'dashboard') { 76 return; 106 77 } 78 self::enqueue_script("hmd-chart-js-geo", '/assets/js/chartjs-geo.js', true, ['heimdall', 'hmd-chartjs']); 79 self::enqueue_script("heimdall-map-widget", '/assets/js/map-widget.js', true, ['heimdall', 'hmd-chartjs', 'hmd-chart-js-geo']); 80 } 107 81 108 82 109 83 110 84 111 /** 112 * @since 1.3.1 113 */ 114 static function get_dashboard_world_map_data() { 85 /** 86 * @since 1.3.1 87 */ 88 static function get_dashboard_world_map_data() 89 { 90 global $wpdb; 115 91 116 global $wpdb;92 check_ajax_referer('heimdall-nonce'); 117 93 118 check_ajax_referer('heimdall-nonce'); 94 $data = []; 95 $query = WorldMapDatabase::get_world_map_data_query(); 119 96 120 $data = []; 97 $records = $wpdb->get_results($query, ARRAY_A); 98 $records = array_map(function ($o) { 99 return [ 100 "r" => intval($o['records']), 101 "n" => $o['country_name'], 102 "c" => $o['country_code'] 103 ]; 104 } , $records); 121 105 122 $query = WP_HeimdallAddon_WorldMap_Database::get_world_map_data_query(); 106 $data["world_map_data"] = $records; 107 $data["world_map_max"] = max(array_column($records , 'r')); 123 108 124 $data["world_map_110m2"] = WP_Heimdall_Plugin::addon_url("world-map","assets/world-110m2.json"); 109 wp_send_json_success($data); 110 } 111 112 113 114 static function handle_com_request($params){ 115 116 $params = false; 117 118 if(empty($params['action']) || empty($params['data'])){ 119 return false; 120 } 121 122 switch($params["action"]){ 125 123 126 $data["world_country_names"] = WP_Heimdall_Plugin::addon_url("world-map","assets/world-country-names.csv");124 } 127 125 128 $data["world_map_data"] = $wpdb->get_results($query , ARRAY_A);126 } 129 127 130 $data["world_map_max"] = max(array_map(function($o){return $o["records"];}, $data["world_map_data"]));131 128 132 wp_send_json_success( $data ); 129 /** 130 * @since 1.3.1 131 */ 132 static function add_country_data($metav2) 133 { 133 134 135 if (isset($metav2["ip"])) { 136 $ip = $metav2["ip"]; 137 $service = self::$service; 138 139 $ip_data = self::get_ip_data($ip); 140 141 if (empty($ip_data)) { 142 143 $response = wp_remote_get("$service/json/$ip"); 144 145 if (is_wp_error($response)) { 146 return $metav2; 147 } 148 149 $json = wp_remote_retrieve_body($response); 150 151 $data = json_decode($json, true); 152 153 WorldMapDatabase::insert_ip_data($ip, $data); 154 155 $metav2['country_code'] = $data["country_code"]; 156 } else { 157 158 $geo = json_decode($ip_data[0]['data'], true); 159 160 $metav2['country_code'] = $geo["country_code"]; 161 } 134 162 } 163 164 return $metav2; 165 } 135 166 136 167 137 168 138 169 139 /**140 * @since 1.3.1141 */142 static function add_country_data($metav2)143 {170 /** 171 * @since 1.3.1 172 */ 173 static function get_ip_data($ip) 174 { 144 175 145 if (isset($metav2["ip"])) { 146 $ip = $metav2["ip"]; 147 $service = self::$service; 176 global $wpdb; 148 177 149 $ip_data = self::get_ip_data($ip);178 $query = WorldMapDatabase::get_find_ip_query($ip); 150 179 151 if(empty($ip_data)){180 $data = $wpdb->get_results($query, ARRAY_A); 152 181 153 $response = wp_remote_get("$service/json/$ip"); 154 155 if(is_wp_error( $response )){ 156 return $metav2; 157 } 158 159 $json = wp_remote_retrieve_body($response); 160 161 $data = json_decode($json , true); 162 163 WP_HeimdallAddon_WorldMap_Database::insert_ip_data($ip , $data); 164 165 $metav2['country_code'] = $data["country_code"]; 166 167 } else { 168 169 $geo = json_decode($ip_data[0]['data'], true); 170 171 $metav2['country_code'] = $geo["country_code"]; 172 173 } 174 } 175 176 return $metav2; 177 } 182 return $data; 183 } 178 184 179 185 180 181 182 /**183 * @since 1.3.1184 */185 static function get_ip_data($ip)186 {187 188 global $wpdb;189 190 $query = WP_HeimdallAddon_WorldMap_Database::get_find_ip_query($ip);191 192 $data = $wpdb->get_results($query , ARRAY_A);193 194 return $data;195 196 }197 198 199 200 201 202 203 }204 186 } -
heimdall/trunk/heimdall.php
r2571934 r2834688 1 1 <?php 2 3 2 /** 3 * Heimdall 4 * 5 * @package Heimdall 6 * @author Rmanaf <me@rmanaf.com> 7 * @copyright 2018-2023 WP Heimdall 8 * @license No License (No Permission) 9 * 10 * @wordpress-plugin 4 11 * Plugin Name: Heimdall 5 * Plugin URI: https:// github.com/Rmanaf/wp-heimdall12 * Plugin URI: https://wp-heimdall.com 6 13 * Description: This plugin is for tracking your client activities. 7 * Version: 1.3.3 14 * Version: 1.4.0 15 * Network: true 16 * Requires at least: 5.8 17 * Requires PHP: 5.6 8 18 * Author: Rmanaf 9 * Author URI: https:// profiles.wordpress.org/rmanaf/10 * License: MIT License11 * License URI: https:// github.com/Rmanaf/wp-heimdall/blob/master/LICENSE19 * Author URI: https://rmanaf.com 20 * License: No License (No Permission) 21 * License URI: https://wp-heimdall.com/license 12 22 * Text Domain: heimdall 13 23 * Domain Path: /languages 14 24 */ 15 25 26 use Heimdall\Communicator; 27 use Heimdall\Core; 28 use Heimdall\Dashboard; 29 use Heimdall\Database; 30 use Heimdall\LicenseManager; 31 use Heimdall\Options; 16 32 17 defined( 'ABSPATH') ordie;33 defined( 'ABSPATH' ) || die; 18 34 19 require_once __DIR__ . "/includes/commons.php";20 require_once __DIR__ . "/includes/database.php";21 require_once __DIR__ . "/includes/options.php";22 require_once __DIR__ . "/includes/dashboard.php";35 define( 'HEIMDALL_FILE', __FILE__ ); 36 define( 'HEIMDALL_DIR', plugin_dir_path( __FILE__ ) ); 37 define( 'HEIMDALL_URL', plugin_dir_url( __FILE__ ) ); 38 define( 'HEIMDALL_VER', '1.4.0' ); 23 39 24 if (!class_exists('WP_Heimdall_Plugin')) { 40 require_once __DIR__ . '/includes/class-database.php'; 41 require_once __DIR__ . '/includes/class-addon.php'; 42 require_once __DIR__ . '/includes/class-core.php'; 43 require_once __DIR__ . '/includes/class-helpers.php'; 44 require_once __DIR__ . '/includes/class-cryptor.php'; 45 require_once __DIR__ . '/includes/class-options.php'; 46 require_once __DIR__ . '/includes/class-dashboard.php'; 47 require_once __DIR__ . '/includes/class-communicator.php'; 48 require_once __DIR__ . '/includes/class-license-manager.php'; 25 49 26 class WP_Heimdall_Plugin 27 { 28 29 static $version = "1.3.3"; 30 31 private static $content_type = [ 32 'Undefined', 33 'Home', 34 'Page', 35 'Post', 36 'Category', 37 'Tag', 38 'Comment' 39 ]; 40 41 42 static $hit_hooks = []; 43 44 45 private static $addons = [ 46 "StatisticsShortcode", 47 "MostUsedKeywords", 48 "WeeklyReport", 49 "Today", 50 "WorldMap" 51 ]; 52 53 54 /** 55 * @since 1.3.1 56 */ 57 static function init() 58 { 59 60 $class = get_called_class(); 61 62 self::$hit_hooks = explode(',', get_option('wp_dcp_heimdall_active_hooks', '')); 63 64 65 66 WP_Heimdall_Database::check_db(); 67 68 WP_Heimdall_Options::init(); 69 70 WP_Heimdall_Dashboard::init(); 71 72 73 74 75 add_action('admin_print_scripts', "$class::enqueue_admin_scripts"); 76 77 78 add_action("wp_enqueue_scripts", "$class::enqueue_scripts"); 79 80 81 add_action('pre_get_posts', "$class::pre_get_posts"); 82 83 84 add_filter("the_content", "$class::filter_content"); 85 86 add_filter("the_excerpt", "$class::filter_excerpt"); 87 88 add_action('plugins_loaded', "$class::load_plugin_textdomain"); 89 90 91 92 foreach (self::$hit_hooks as $h) { 93 94 add_action($h, function () use ($h) { 95 96 if (did_action($h) > 1) { 97 return; 98 } 99 100 self::record_activity(); 101 }); 102 } 103 104 self::activate_addons(); 105 } 106 107 108 /** 109 * @since 1.3.1 110 */ 111 static function load_plugin_textdomain(){ 112 load_plugin_textdomain( "heimdall", FALSE, basename( dirname( __FILE__ ) ) . '/languages/' ); 113 } 114 115 116 /** 117 * @since 1.0.0 118 */ 119 static function pre_get_posts($query) 120 { 121 122 if (is_admin()) { 123 return; 124 } 125 126 if (did_action("pre_get_posts") > 1) { 127 return; 128 } 129 130 131 if ($query->is_search() && $query->is_main_query()) { 132 133 $keyword = get_search_query(); 134 135 // ignore whitespace and empty values 136 if (empty(trim($keyword))) { 137 return; 138 } 139 140 $ip = WP_Heimdall_Commons::get_ip_address(); 141 142 if ($ip == null) { 143 $ip = 'unknown'; 144 } 145 146 WP_Heimdall_Database::insert_once($ip, null, 4, 'pre_get_posts', $keyword); 147 } 148 } 149 150 151 /** 152 * @since 1.0.0 153 */ 154 static function filter_excerpt($excerpt) 155 { 156 157 $option = ''; 158 159 if (is_single()) { 160 $option = 'wp_dcp_heimdall_post_position'; 161 } 162 163 if (empty($option)) { 164 return $excerpt; 165 } 166 167 $pos = get_option($option, 0); 168 169 $value = apply_filters("heimdall--views-num", "[statistics]"); 170 171 switch ($pos) { 172 case 3: 173 return $excerpt . $value; 174 case 4: 175 return $value . $excerpt; 176 default: 177 return $excerpt; 178 } 179 } 180 181 /** 182 * @since 1.0.0 183 */ 184 static function filter_content($content) 185 { 186 187 $option = ''; 188 189 if (is_page()) { 190 $option = 'wp_dcp_heimdall_page_position'; 191 } 192 193 if (is_single()) { 194 $option = 'wp_dcp_heimdall_post_position'; 195 } 196 197 if (empty($option)) { 198 return $content; 199 } 200 201 $pos = get_option($option, 0); 202 203 $value = apply_filters("heimdall--views-num", "[statistics]"); 204 205 switch ($pos) { 206 case 1: 207 return $content . $value; 208 case 2: 209 return $value . $content; 210 default: 211 return $content; 212 } 213 } 214 215 216 /** 217 * @since 1.0.0 218 */ 219 static function enqueue_scripts() 220 { 221 222 $ver = self::$version; 223 224 $data = apply_filters("heimdall--client-script", [ 225 'ajaxurl' => admin_url('admin-ajax.php'), 226 'ajaxnonce' => wp_create_nonce('heimdall-nonce') 227 ]); 228 229 wp_register_script("heimdall-client", "", []); 230 231 wp_localize_script("heimdall-client", "heimdall", $data); 232 233 wp_enqueue_script("heimdall-client"); 234 235 wp_enqueue_script("heimdall-client-ajax", plugins_url('/assets/js/client-ajax.js', __FILE__), ["heimdall-client"], $ver, false); 236 } 237 238 239 /** 240 * @since 1.0.0 241 */ 242 static function enqueue_admin_scripts() 243 { 244 245 $ver = self::$version; 246 247 $screen = get_current_screen(); 248 249 if (current_user_can('administrator') && $screen->id == 'dashboard') { 250 251 // tabs 252 wp_enqueue_style("heimdall-tabs", plugins_url('/assets/css/tabs.css', __FILE__), [], $ver, "all"); 253 254 wp_enqueue_script("heimdall-tabs", plugins_url('/assets/js/tabs.js', __FILE__), [], $ver, false); 255 256 257 // chart.js 258 wp_enqueue_script('dcp-chart-js-bundle', plugins_url('/assets/js/chart.bundle.min.js', __FILE__), [], $ver, false); 259 260 261 // d3.js 262 wp_enqueue_script('d3', plugins_url('/assets/js/d3.min.js', __FILE__), [], $ver, false); 263 264 265 266 267 wp_register_script('heimdall-admin', '', [], false); 268 269 wp_enqueue_script('heimdall-admin'); 270 271 wp_localize_script('heimdall-admin', 'heimdall', apply_filters("heimdall--localize-script", [ 272 'is_multisite' => is_multisite(), 273 'ajaxurl' => admin_url('admin-ajax.php'), 274 'ajaxnonce' => wp_create_nonce('heimdall-nonce') 275 ])); 276 } 277 } 278 279 280 /** 281 * @since 1.3.1 282 */ 283 static function get_request_type_page() 284 { 285 286 global $post; 287 288 $type = 0; 289 $page = null; 290 291 /** 292 * type 0 is undefined 293 * type 1 is homepage 294 * type 2 is page 295 * type 3 is post 296 * type 4 is search 297 * type 5 is 404 298 */ 299 if (is_home() || is_front_page()) { 300 $type = 1; 301 } else if (is_404()) { 302 $type = 5; 303 } else if (is_page() && !is_front_page()) { 304 $page = $post->ID; 305 $type = 2; 306 } else if (is_single()) { 307 $page = $post->ID; 308 $type = 3; 309 } 310 311 $type = apply_filters("heimdall--record-type", $type); 312 313 return [ 314 "page" => $page, 315 "type" => $type 316 ]; 317 } 318 319 320 /** 321 * @since 1.0.0 322 */ 323 static function record_activity($type = null, $pid = null) 324 { 325 326 global $wp; 327 328 $type_post_dt = self::get_request_type_page(); 329 330 $ip = WP_Heimdall_Commons::get_ip_address(); 331 332 if ($ip == null) { 333 $ip = 'unknown'; 334 } 335 336 $filter = current_filter(); 337 338 $url = add_query_arg($wp->query_vars, home_url($wp->request)); 339 340 $metav2 = []; 341 342 if (!empty($ip) && $ip != "unknown") { 343 $metav2["ip"] = $ip; 344 } 345 346 $metav2["url"] = urlencode($url); 347 348 $metav2 = apply_filters("heimdall--record-metadata", $metav2); 349 350 $metav2 = json_encode($metav2, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); 351 352 WP_Heimdall_Database::insert_once( 353 $ip, 354 is_null($pid) ? $type_post_dt["page"] : $pid, 355 is_null($type) ? $type_post_dt["type"] : $type, 356 $filter, 357 $type_post_dt["type"] == 5 ? get_queried_object() : null, 358 $metav2 359 ); 360 361 } 362 363 364 365 /** 366 * @since 1.0.0 367 */ 368 static function activate_addons() 369 { 370 371 $addons_dir = __DIR__ . "/addons"; 372 373 foreach (glob("$addons_dir/*", GLOB_ONLYDIR) as $addon) { 374 375 $name = basename($addon); 376 377 $path = path_join($addon, "{$name}.php"); 378 379 if (file_exists($path)) { 380 381 require_once $path; 382 } 383 } 384 385 foreach (self::$addons as $addon) { 386 $class = "WP_HeimdallAddon_" . $addon; 387 $class::init(); 388 } 389 } 390 391 392 /** 393 * @since 1.0.0 394 */ 395 static function addon_url($addon, $path) 396 { 397 $path = rtrim(ltrim($path, "/"), "/"); 398 return plugins_url("/addons/$addon/$path", __FILE__); 399 } 400 } 401 } 402 403 WP_Heimdall_Plugin::init(); 50 Database::init(); 51 Options::init(); 52 Dashboard::init(); 53 Core::init(); 54 Communicator::init(); 55 LicenseManager::init(); -
heimdall/trunk/readme.txt
r2571934 r2834688 1 1 === Heimdall === 2 2 Contributors: rmanaf 3 Tags: statistics, stat, heimdall 4 Requires at least: 4.5.0 5 Tested up to: 5.8.0 6 Stable tag: 1.3.3 7 License: MIT License 8 License URI: https://github.com/Rmanaf/wp-heimdall/blob/master/LICENSE 3 Tags: statistic, statistics, stat, heimdall 4 Requires at least: 5.8.0 5 Requires PHP: 5.6 6 Tested up to: 6.1.0 7 Stable tag: 1.4.0 8 License: No License (No Permission) 9 License URI: https://wp-heimdall.com/license 9 10 10 11 This plugin is for tracking your client activities. … … 12 13 === Description === 13 14 14 Once the plugin is activated, navigate to **Settings > General** in your WordPress Dashboard. On the **Heimdall** section, there you can find all the customization options.15 Once the plugin is activated, navigate to **Settings > Heimdall** in your WordPress Dashboard. There you can find all the customization options.
Note: See TracChangeset
for help on using the changeset viewer.