123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- <?php
- /**
- * Generates the timezone selection form and JavaScript.
- *
- * Note: 'UTC/UTC' is mapped to 'UTC' to form a valid option
- *
- * Example: preselect Europe/Paris
- * list($htmlform, $js) = generateTimeZoneForm('Europe/Paris');
- *
- * @param string $preselected_timezone preselected timezone (optional)
- *
- * @return an array containing the generated HTML form and Javascript code
- **/
- function generateTimeZoneForm($preselectedTimezone='')
- {
- // Select the server timezone
- if ($preselectedTimezone == '') {
- $preselectedTimezone = date_default_timezone_get();
- }
- if ($preselectedTimezone == 'UTC') {
- $pcity = $pcontinent = 'UTC';
- } else {
- // Try to split the provided timezone
- $spos = strpos($preselectedTimezone, '/');
- $pcontinent = substr($preselectedTimezone, 0, $spos);
- $pcity = substr($preselectedTimezone, $spos+1);
- }
- // Display config form:
- $timezoneForm = '';
- $timezoneJs = '';
- // The list is in the form 'Europe/Paris', 'America/Argentina/Buenos_Aires'
- // We split the list in continents/cities.
- $continents = array();
- $cities = array();
- // TODO: use a template to generate the HTML/Javascript form
- foreach (timezone_identifiers_list() as $tz) {
- if ($tz == 'UTC') {
- $tz = 'UTC/UTC';
- }
- $spos = strpos($tz, '/');
- if ($spos !== false) {
- $continent = substr($tz, 0, $spos);
- $city = substr($tz, $spos+1);
- $continents[$continent] = 1;
- if (!isset($cities[$continent])) {
- $cities[$continent] = '';
- }
- $cities[$continent] .= '<option value="'.$city.'"';
- if ($pcity == $city) {
- $cities[$continent] .= ' selected="selected"';
- }
- $cities[$continent] .= '>'.$city.'</option>';
- }
- }
- $continentsHtml = '';
- $continents = array_keys($continents);
- foreach ($continents as $continent) {
- $continentsHtml .= '<option value="'.$continent.'"';
- if ($pcontinent == $continent) {
- $continentsHtml .= ' selected="selected"';
- }
- $continentsHtml .= '>'.$continent.'</option>';
- }
- // Timezone selection form
- $timezoneForm = 'Continent:';
- $timezoneForm .= '<select name="continent" id="continent" onChange="onChangecontinent();">';
- $timezoneForm .= $continentsHtml.'</select>';
- $timezoneForm .= ' City:';
- $timezoneForm .= '<select name="city" id="city">'.$cities[$pcontinent].'</select><br />';
- // Javascript handler - updates the city list when the user selects a continent
- $timezoneJs = '<script>';
- $timezoneJs .= 'function onChangecontinent() {';
- $timezoneJs .= 'document.getElementById("city").innerHTML =';
- $timezoneJs .= ' citiescontinent[document.getElementById("continent").value]; }';
- $timezoneJs .= 'var citiescontinent = '.json_encode($cities).';';
- $timezoneJs .= '</script>';
- return array($timezoneForm, $timezoneJs);
- }
- /**
- * Tells if a continent/city pair form a valid timezone
- *
- * Note: 'UTC/UTC' is mapped to 'UTC'
- *
- * @param string $continent the timezone continent
- * @param string $city the timezone city
- *
- * @return whether continent/city is a valid timezone
- */
- function isTimeZoneValid($continent, $city)
- {
- if ($continent == 'UTC' && $city == 'UTC') {
- return true;
- }
- return in_array(
- $continent.'/'.$city,
- timezone_identifiers_list()
- );
- }
|