/
timezone.inc.php
125 lines (109 loc) · 4.41 KB
/
timezone.inc.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
<?php
/*
* This file is part of Zoph.
*
* Zoph is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Zoph is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with Zoph; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
class TimeZone extends DateTimeZone {
function get_xml($search) {
$xml = new DOMDocument('1.0','UTF-8');
$rootnode=$xml->createElement("zones");
$zones=$this->listIdentifiers();
array_unshift($zones, " ");
$len=strlen($search);
foreach($zones as $id => $tz) {
$tzshort=strtolower(substr($tz,0,$len));
if(strtolower($search)==$tzshort) {
$newchild=$xml->createElement("tz");
$key=$xml->createElement("key");
$title=$xml->createElement("title");
$key->appendChild($xml->createTextNode($id));
$title->appendChild($xml->createTextNode($tz));
$newchild->appendChild($key);
$newchild->appendChild($title);
$rootnode->appendChild($newchild);
}
}
$xml->appendChild($rootnode);
return $xml->saveXML();
}
public static function getSelectArray() {
$zones=self::listIdentifiers();
array_unshift($zones, "");
return $zones;
}
public static function getKey($tz) {
return array_search($tz,self::getSelectArray());
}
public static function createPulldown($name, $value=null, $user=null) {
$id=preg_replace("/^_+/", "", $name);
if($value) {
$text=$value;
} else {
$text="";
}
if(AUTOCOMPLETE && JAVASCRIPT) {
$html="<input type=hidden id='" . $id . "' name='" . $name. "'" .
" value='" . $value . "'>";
$html.="<input type=text id='_" . $id . "' name='_" . $name. "'" .
" value='" . $text . "' class='autocomplete'>";
} else {
$html=create_pulldown("timezone_id", self::getKey($value), self::getSelectArray());
}
return $html;
}
public static function validate($tz) {
// Checks if $tz contains a valid timezone string
$tzones=DateTimeZone::listIdentifiers();
return array_search($tz, $tzones);
}
public static function guess($lat, $lon) {
if(minimum_version("5.1.2") && class_exists("XMLReader")) {
$xml=new XMLReader();
@$xml->open("http://ws.geonames.org/timezone?lat=" .
$lat . "&lng=" . $lon) or $failed=true;
if (!$failed) {
while($xml->read() && !$tz) {
if($xml->name=="timezoneId") {
$xml->read();
$tz=$xml->value;
}
}
return $tz;
} else {
$error=error_get_last();
log::msg("Could not connect to Geonames site: " .
$error["message"], log::ERROR, log::GENERAL);
return null;
}
} else {
return null;
}
}
}
class Time extends DateTime {
function __construct($datetime, $tz=null) {
try {
if(TimeZone::validate($tz->getName())) {
parent::__construct($datetime,$tz);
} else {
parent::__construct($datetime);
}
} catch (Exception $e){
echo "<b>Invalid time</b><br>";
log::msg("<pre>" . $e->getMessage() . "</pre>", log::DEBUG, log::GENERAL);
}
}
}
?>