TimeZone.php
[Pman.Core] / TimeZone.php
1 <?php
2 require_once 'Pman.php';
3
4 class Pman_Core_TimeZone extends Pman
5 {
6     function getAuth()
7     {
8         parent::getAuth();
9         
10         if (!$this->getAuthUser()) {  
11             $this->jerr("Not authenticated", array('authFailure' => true));
12         }
13         
14         return true;
15     }
16
17     function get($base, $opts=array())
18     {
19         self::getOffsets();
20
21         $data = array();
22
23         foreach(self::$offsets as $tz => $o) {
24             $arr = explode('/', $tz);
25
26             if(!empty($_REQUEST['region']) && $_REQUEST['region'] != $arr[0]) {
27                 continue;
28             }
29
30             $areaStartSeach = strtolower($_REQUEST['query']['area_start']);
31             if(!empty($_REQUEST['query']['area_start']) && substr($arr[1], 0, strlen($_REQUEST['query']['area_start'])) != $_REQUEST['query']['area_start']){
32                 continue;
33             }
34             $data[] = array(
35                 'region' => $arr[0],
36                 'area' => $arr[1],
37                 'offset' => $o,
38                 'displayArea' => self::getDisplayArea($tz)
39             );
40         }
41
42         echo json_encode(array(
43             'data' => $data,
44             'metaData' => array(
45                 'root' => 'data',
46                 'successProperty' => 'success',
47                 'totalProperty' => 'total',
48                 'fields' => array(
49                     'region',
50                     'area',
51                     'offset',
52                     'displayArea'
53                 )
54             ),
55             'success' => true,
56             'total' => count($data),
57             
58         ));
59         exit;
60     }
61
62     function post($base) {
63         die('Invalid post');
64     }
65
66     static $offsets = array();
67
68     static function getOffsets()
69     {
70         if(!empty(self::$offsets)) {
71             return self::$offsets;
72         }
73
74         $ce = DB_DataObject::factory('core_enum');
75         $ce->query('
76             SELECT
77                 *, TIME_FORMAT(TIMEDIFF(NOW(), CONVERT_TZ(NOW(), Name, "UTC")), "%H:%i") as offset
78             FROM
79                 mysql.time_zone_name
80             ORDER BY
81                 offset DESC,
82                 Name DESC
83         ');
84
85         while($ce->fetch()) {
86             // ignroe timezone such as 'CET' and 'America/Argentina/Buenos_Aires'
87             if(substr_count($ce->Name, '/') != 1) {
88                 continue;
89             }
90
91             $ar = explode('/', $ce->Name);
92             // ignore timezone such as 'Etc/GMT+8'
93             if($ar[0] == 'Etc') {
94                 continue;
95             }
96
97             self::$offsets[$ce->Name] = substr($ce->offset, 0, 1) == '-' ? $ce->offset : '+' . $ce->offset;
98         }
99
100         return self::$offsets;
101     }
102
103     static function getDisplayArea($timezone)
104     {
105         self::getOffsets();
106
107         // invalid timezone
108         if(!isset(self::$offsets[$timezone])) {
109             return '';
110         }
111
112         $ar = explode('/', $timezone);
113
114         // e.g. 'Hong_Kong (GMT +08:00)'
115         return $ar[1] . ' (GMT ' . self::$offsets[$timezone] . ')';
116     }
117
118     
119 }