TTi18n::gettext( '25-Feb-01 (dd-mmm-yy)' ), 'd-M-Y' => TTi18n::gettext( '25-Feb-2001 (dd-mmm-yyyy)' ), //PHP 5.1.2 fails to parse these with strtotime it looks like //'d/M/y' => '25/Feb/01 (dd/mmm/yy)', //'d/M/Y' => '25/Feb/2001 (dd/mmm/yyyy)', 'dMY' => TTi18n::gettext( '25Feb2001 (ddmmmyyyy)' ), 'd/m/Y' => '25/02/2001 (dd/mm/yyyy)', 'd/m/y' => '25/02/01 (dd/mm/yy)', 'd-m-y' => '25-02-01 (dd-mm-yy)', 'd-m-Y' => '25-02-2001 (dd-mm-yyyy)', 'm/d/y' => '02/25/01 (mm/dd/yy)', 'm/d/Y' => '02/25/2001 (mm/dd/yyyy)', 'm-d-y' => '02-25-01 (mm-dd-yy)', 'm-d-Y' => '02-25-2001 (mm-dd-yyyy)', 'Y-m-d' => '2001-02-25 (yyyy-mm-dd)', //'Ymd' => '20010225 (yyyymmdd)', //This can't be parsed properly due to all integer values, parseDateTime() thinks its an epoch. 'M-d-y' => TTi18n::gettext( 'Feb-25-01 (mmm-dd-yy)' ), 'M-d-Y' => TTi18n::gettext( 'Feb-25-2001 (mmm-dd-yyyy)' ), 'l, F d Y' => TTi18n::gettext( 'Sunday, February 25 2001' ), 'D, F d Y' => TTi18n::gettext( 'Sun, February 25 2001' ), 'D, M d Y' => TTi18n::gettext( 'Sun, Feb 25 2001' ), 'D, d-M-Y' => TTi18n::gettext( 'Sun, 25-Feb-2001' ), 'D, dMY' => TTi18n::gettext( 'Sun, 25Feb2001' ), ]; if ( defined( 'TIMETREX_API' ) == true && TIMETREX_API == true ) { $retval = Misc::addSortPrefix( $retval ); } break; // I18n: We use fewer calendar options for non-en langs, as otherwise strtotime chokes. case 'date_format_example': $retval = [ 'd-M-y' => TTi18n::gettext( 'dd-mmm-yy' ), 'd-M-Y' => TTi18n::gettext( 'dd-mmm-yyyy' ), 'dMY' => TTi18n::gettext( 'ddmmmyyyy' ), 'd/m/Y' => 'dd/mm/yyyy', 'd/m/y' => 'dd/mm/yy', 'd-m-y' => 'dd-mm-yy', 'd-m-Y' => 'dd-mm-yyyy', 'm/d/y' => 'mm/dd/yy', 'm/d/Y' => 'mm/dd/yyyy', 'm-d-y' => 'mm-dd-yy', 'm-d-Y' => 'mm-dd-yyyy', 'Y-m-d' => 'yyyy-mm-dd', 'M-d-y' => TTi18n::gettext( 'mmm-dd-yy' ), 'M-d-Y' => TTi18n::gettext( 'mmm-dd-yyyy' ), 'l, F d Y' => TTi18n::gettext( 'mmmmmmmm dd yyyy' ), 'D, F d Y' => TTi18n::gettext( 'mmmmmmmm dd yyyy' ), 'D, M d Y' => TTi18n::gettext( 'mm dd yyyy' ), 'D, d-M-Y' => TTi18n::gettext( 'dd-mmm-yy' ), 'D, dMY' => TTi18n::gettext( 'ddmmmyyyy' ), ]; break; case 'other_date_format': $retval = [ 'd/m/Y' => '25/02/2001 (dd/mm/yyyy)', 'd/m/y' => '25/02/01 (dd/mm/yy)', 'd-m-y' => '25-02-01 (dd-mm-yy)', 'd-m-Y' => '25-02-2001 (dd-mm-yyyy)', 'm/d/y' => '02/25/01 (mm/dd/yy)', 'm/d/Y' => '02/25/2001 (mm/dd/yyyy)', 'm-d-y' => '02-25-01 (mm-dd-yy)', 'm-d-Y' => '02-25-2001 (mm-dd-yyyy)', 'Y-m-d' => '2001-02-25 (yyyy-mm-dd)', ]; if ( defined( 'TIMETREX_API' ) == true && TIMETREX_API == true ) { $retval = Misc::addSortPrefix( $retval ); } break; case 'moment_date_format': //NOTICE: When changing these, we may need to update the mobile app as it has them hardcoded there too. $retval = [ 'D, F d Y' => 'ddd, MMMM DD YYYY', 'D, M d Y' => 'ddd, MMM DD YYYY', 'D, d-M-Y' => 'ddd, DD-MMM-YYYY', 'D, dMY' => 'ddd, DDMMMYYYY', 'M-d-Y' => 'MMM-DD-YYYY', 'M-d-y' => 'MMM-DD-YY', 'Y-m-d' => 'YYYY-MM-DD', 'd-M-Y' => 'DD-MMM-YYYY', 'd-M-y' => 'DD-MMM-YY', 'd-m-Y' => 'DD-MM-YYYY', 'd-m-y' => 'DD-MM-YY', 'd/m/Y' => 'DD/MM/YYYY', 'd/m/y' => 'DD/MM/YY', 'dMY' => 'DDMMMYYYY', 'l, F d Y' => 'dddd, MMMM DD YYYY', 'm-d-Y' => 'MM-DD-YYYY', 'm-d-y' => 'MM-DD-YY', 'm/d/Y' => 'MM/DD/YYYY', 'm/d/y' => 'MM/DD/YY', ]; break; case 'time_format': $retval = [ 'g:i A' => TTi18n::gettext( '8:09 PM' ), 'g:i a' => TTi18n::gettext( '8:09 pm' ), 'G:i' => TTi18n::gettext( '20:09' ), 'g:i A T' => TTi18n::gettext( '8:09 PM GMT' ), 'G:i T' => TTi18n::gettext( '20:09 GMT' ), //Include seconds so they can properly validate rounding policies and such. 'g:i:s A' => TTi18n::gettext( '8:09:11 PM' ), 'g:i:s a' => TTi18n::gettext( '8:09:11 pm' ), 'G:i:s' => TTi18n::gettext( '20:09:11' ), 'g:i:s A T' => TTi18n::gettext( '8:09:11 PM GMT' ), 'G:i:s T' => TTi18n::gettext( '20:09:11 GMT' ), ]; break; case 'time_format_example': $retval = [ 'g:i A' => TTi18n::gettext( 'HH:MM AM' ), 'g:i a' => TTi18n::gettext( 'HH:MM am' ), 'G:i' => TTi18n::gettext( 'HH:MM' ), 'g:i A T' => TTi18n::gettext( 'HH:MM AM TZ' ), 'G:i T' => TTi18n::gettext( 'HH:MM TZ' ), 'g:i:s A' => TTi18n::gettext( 'HH:MM:SS AM' ), 'g:i:s a' => TTi18n::gettext( 'HH:MM:SS am' ), 'G:i:s' => TTi18n::gettext( 'HH:MM:SS' ), 'g:i:s A T' => TTi18n::gettext( 'HH:MM:SS AM TZ' ), 'G:i:s T' => TTi18n::gettext( 'HH:MM:SS TZ' ), ]; break; case 'moment_time_format': $retval = [ 'g:i A' => 'hh:mm A', 'g:i a' => 'hh:mm a', 'G:i' => 'HH:mm', 'g:i A T' => 'hh:mm A Z', 'G:i T' => 'HH:mm Z', //Include seconds so they can properly validate rounding policies and such. 'g:i:s A' => 'hh:mm:ss A', 'g:i:s a' => 'hh:mm:ss a', 'G:i:s' => 'HH:mm:ss', 'g:i:s A T' => 'hh:mm:ss A Z', 'G:i:s T' => 'HH:mm:ss Z', ]; break; case 'date_time_format': //Merge Date and Time formats together. $date_formats = $this->getOptions( 'date_format' ); $time_formats = $this->getOptions( 'time_format' ); if ( is_array( $date_formats ) && is_array( $time_formats ) ) { foreach ( $date_formats as $date_format => $date_format_name ) { foreach ( $time_formats as $time_format => $time_format_name ) { //Use "|" as a separate so we can later split them back into separate date/time formats. $retval[$date_format . '_' . $time_format] = trim( preg_replace( '/\(.*\)/i', '', $date_format_name ) ) . ' ' . $time_format_name; } } } break; case 'time_unit_format': $retval = [ 10 => TTi18n::gettext( 'hh:mm (2:15)' ), 12 => TTi18n::gettext( 'hh:mm:ss (2:15:59)' ), 20 => TTi18n::gettext( 'Hours (2.25)' ), 22 => TTi18n::gettext( 'Hours (2.141)' ), 23 => TTi18n::gettext( 'Hours (2.3587)' ), 30 => TTi18n::gettext( 'Minutes (135)' ), 40 => TTi18n::gettext( 'Seconds (3600)' ), ]; break; case 'distance_format': $retval = [ 10 => TTi18n::gettext( 'Kilometers' ), 20 => TTi18n::gettext( 'Miles' ), 30 => TTi18n::gettext( 'Meters' ), ]; break; // I18n: These timezones probably should be translated, but doing so would add ~550 // lines to the translator's workload for each lang. And these are hard to translate. // Probably better to use an already translated timezone class, if one exists. // //Commented out timezones do not work in PostgreSQL 8.2, as they hardcode timezone data into versions. case 'time_zone': $retval = [ 'America/Adak' => 'America/Adak', 'America/Anchorage' => 'America/Anchorage', 'America/Anguilla' => 'America/Anguilla', 'America/Antigua' => 'America/Antigua', 'America/Araguaina' => 'America/Araguaina', 'America/Aruba' => 'America/Aruba', 'America/Asuncion' => 'America/Asuncion', 'America/Barbados' => 'America/Barbados', 'America/Belem' => 'America/Belem', 'America/Belize' => 'America/Belize', 'America/Boa_Vista' => 'America/Boa Vista', 'America/Bogota' => 'America/Bogota', 'America/Boise' => 'America/Boise', 'America/Buenos_Aires' => 'America/Buenos Aires', 'America/Cambridge_Bay' => 'America/Cambridge Bay', 'America/Cancun' => 'America/Cancun', 'America/Caracas' => 'America/Caracas', 'America/Catamarca' => 'America/Catamarca', 'America/Cayenne' => 'America/Cayenne', 'America/Cayman' => 'America/Cayman', 'America/Chicago' => 'America/Chicago', 'America/Chihuahua' => 'America/Chihuahua', 'America/Cordoba' => 'America/Cordoba', 'America/Costa_Rica' => 'America/Costa Rica', 'America/Cuiaba' => 'America/Cuiaba', 'America/Curacao' => 'America/Curacao', 'America/Danmarkshavn' => 'America/Danmarkshavn', 'America/Dawson' => 'America/Dawson', 'America/Dawson_Creek' => 'America/Dawson Creek', 'America/Denver' => 'America/Denver', 'America/Detroit' => 'America/Detroit', 'America/Dominica' => 'America/Dominica', 'America/Edmonton' => 'America/Edmonton', 'America/Eirunepe' => 'America/Eirunepe', 'America/El_Salvador' => 'America/El Salvador', 'America/Ensenada' => 'America/Ensenada', 'America/Fort_Wayne' => 'America/Fort Wayne', 'America/Fortaleza' => 'America/Fortaleza', 'America/Glace_Bay' => 'America/Glace Bay', 'America/Godthab' => 'America/Godthab', 'America/Goose_Bay' => 'America/Goose Bay', 'America/Grand_Turk' => 'America/Grand Turk', 'America/Grenada' => 'America/Grenada', 'America/Guadeloupe' => 'America/Guadeloupe', 'America/Guatemala' => 'America/Guatemala', 'America/Guayaquil' => 'America/Guayaquil', 'America/Guyana' => 'America/Guyana', 'America/Halifax' => 'America/Halifax', 'America/Havana' => 'America/Havana', 'America/Hermosillo' => 'America/Hermosillo', 'America/Indiana/Indianapolis' => 'America/Indiana/Indianapolis', 'America/Indiana/Knox' => 'America/Indiana/Knox', 'America/Indiana/Marengo' => 'America/Indiana/Marengo', 'America/Indiana/Vevay' => 'America/Indiana/Vevay', 'America/Indianapolis' => 'America/Indianapolis', 'America/Inuvik' => 'America/Inuvik', 'America/Iqaluit' => 'America/Iqaluit', 'America/Jamaica' => 'America/Jamaica', 'America/Jujuy' => 'America/Jujuy', 'America/Juneau' => 'America/Juneau', 'America/Kentucky/Louisville' => 'America/Kentucky/Louisville', 'America/Kentucky/Monticello' => 'America/Kentucky/Monticello', 'America/Knox_IN' => 'America/Knox IN', 'America/La_Paz' => 'America/La Paz', 'America/Lima' => 'America/Lima', 'America/Los_Angeles' => 'America/Los Angeles', 'America/Louisville' => 'America/Louisville', 'America/Maceio' => 'America/Maceio', 'America/Managua' => 'America/Managua', 'America/Manaus' => 'America/Manaus', 'America/Martinique' => 'America/Martinique', 'America/Mazatlan' => 'America/Mazatlan', 'America/Mendoza' => 'America/Mendoza', 'America/Menominee' => 'America/Menominee', 'America/Merida' => 'America/Merida', 'America/Mexico_City' => 'America/Mexico City', 'America/Miquelon' => 'America/Miquelon', 'America/Moncton' => 'America/Moncton', 'America/Monterrey' => 'America/Monterrey', 'America/Montevideo' => 'America/Montevideo', 'America/Montreal' => 'America/Montreal', 'America/Montserrat' => 'America/Montserrat', 'America/Nassau' => 'America/Nassau', 'America/New_York' => 'America/New York', 'America/Nipigon' => 'America/Nipigon', 'America/Nome' => 'America/Nome', 'America/Noronha' => 'America/Noronha', 'America/North_Dakota/Center' => 'America/North Dakota/Center', 'America/Panama' => 'America/Panama', 'America/Pangnirtung' => 'America/Pangnirtung', 'America/Paramaribo' => 'America/Paramaribo', 'America/Phoenix' => 'America/Phoenix', 'America/Port-au-Prince' => 'America/Port-au-Prince', 'America/Port_of_Spain' => 'America/Port of Spain', 'America/Porto_Acre' => 'America/Porto Acre', 'America/Porto_Velho' => 'America/Porto Velho', 'America/Puerto_Rico' => 'America/Puerto Rico', 'America/Rainy_River' => 'America/Rainy River', 'America/Rankin_Inlet' => 'America/Rankin Inlet', 'America/Recife' => 'America/Recife', 'America/Regina' => 'America/Regina', 'America/Rio_Branco' => 'America/Rio Branco', 'America/Rosario' => 'America/Rosario', 'America/Santiago' => 'America/Santiago', 'America/Santo_Domingo' => 'America/Santo Domingo', 'America/Sao_Paulo' => 'America/Sao Paulo', 'America/Scoresbysund' => 'America/Scoresbysund', 'America/Shiprock' => 'America/Shiprock', 'America/St_Johns' => 'America/St Johns', 'America/St_Kitts' => 'America/St Kitts', 'America/St_Lucia' => 'America/St Lucia', 'America/St_Thomas' => 'America/St Thomas', 'America/St_Vincent' => 'America/St Vincent', 'America/Swift_Current' => 'America/Swift Current', 'America/Tegucigalpa' => 'America/Tegucigalpa', 'America/Thule' => 'America/Thule', 'America/Thunder_Bay' => 'America/Thunder Bay', 'America/Tijuana' => 'America/Tijuana', 'America/Toronto' => 'America/Toronto', 'America/Tortola' => 'America/Tortola', 'America/Vancouver' => 'America/Vancouver', 'America/Virgin' => 'America/Virgin', 'America/Whitehorse' => 'America/Whitehorse', 'America/Winnipeg' => 'America/Winnipeg', 'America/Yakutat' => 'America/Yakutat', 'America/Yellowknife' => 'America/Yellowknife', 'Africa/Abidjan' => 'Africa/Abidjan', 'Africa/Accra' => 'Africa/Accra', 'Africa/Addis_Ababa' => 'Africa/Addis Ababa', 'Africa/Algiers' => 'Africa/Algiers', 'Africa/Asmera' => 'Africa/Asmera', 'Africa/Bamako' => 'Africa/Bamako', 'Africa/Bangui' => 'Africa/Bangui', 'Africa/Banjul' => 'Africa/Banjul', 'Africa/Bissau' => 'Africa/Bissau', 'Africa/Brazzaville' => 'Africa/Brazzaville', 'Africa/Cairo' => 'Africa/Cairo', 'Africa/Casablanca' => 'Africa/Casablanca', 'Africa/Ceuta' => 'Africa/Ceuta', 'Africa/Conakry' => 'Africa/Conakry', 'Africa/Dakar' => 'Africa/Dakar', 'Africa/Dar_es_Salaam' => 'Africa/Dar es Salaam', 'Africa/Djibouti' => 'Africa/Djibouti', 'Africa/Douala' => 'Africa/Douala', 'Africa/El_Aaiun' => 'Africa/El Aaiun', 'Africa/Freetown' => 'Africa/Freetown', 'Africa/Johannesburg' => 'Africa/Johannesburg', 'Africa/Kampala' => 'Africa/Kampala', 'Africa/Khartoum' => 'Africa/Khartoum', 'Africa/Kinshasa' => 'Africa/Kinshasa', 'Africa/Lagos' => 'Africa/Lagos', 'Africa/Libreville' => 'Africa/Libreville', 'Africa/Lome' => 'Africa/Lome', 'Africa/Luanda' => 'Africa/Luanda', 'Africa/Malabo' => 'Africa/Malabo', 'Africa/Maputo' => 'Africa/Maputo', 'Africa/Maseru' => 'Africa/Maseru', 'Africa/Mbabane' => 'Africa/Mbabane', 'Africa/Mogadishu' => 'Africa/Mogadishu', 'Africa/Monrovia' => 'Africa/Monrovia', 'Africa/Nairobi' => 'Africa/Nairobi', 'Africa/Ndjamena' => 'Africa/Ndjamena', 'Africa/Niamey' => 'Africa/Niamey', 'Africa/Nouakchott' => 'Africa/Nouakchott', 'Africa/Ouagadougou' => 'Africa/Ouagadougou', 'Africa/Porto-Novo' => 'Africa/Porto-Novo', 'Africa/Sao_Tome' => 'Africa/Sao Tome', 'Africa/Timbuktu' => 'Africa/Timbuktu', 'Africa/Tripoli' => 'Africa/Tripoli', 'Africa/Tunis' => 'Africa/Tunis', 'Africa/Windhoek' => 'Africa/Windhoek', 'Asia/Aden' => 'Asia/Aden', 'Asia/Almaty' => 'Asia/Almaty', 'Asia/Amman' => 'Asia/Amman', 'Asia/Anadyr' => 'Asia/Anadyr', 'Asia/Aqtau' => 'Asia/Aqtau', 'Asia/Aqtobe' => 'Asia/Aqtobe', 'Asia/Ashgabat' => 'Asia/Ashgabat', 'Asia/Ashkhabad' => 'Asia/Ashkhabad', 'Asia/Baghdad' => 'Asia/Baghdad', 'Asia/Bahrain' => 'Asia/Bahrain', 'Asia/Baku' => 'Asia/Baku', 'Asia/Bangkok' => 'Asia/Bangkok', 'Asia/Beirut' => 'Asia/Beirut', 'Asia/Bishkek' => 'Asia/Bishkek', 'Asia/Brunei' => 'Asia/Brunei', 'Asia/Calcutta' => 'Asia/Calcutta', 'Asia/Choibalsan' => 'Asia/Choibalsan', 'Asia/Chongqing' => 'Asia/Chongqing', 'Asia/Chungking' => 'Asia/Chungking', 'Asia/Colombo' => 'Asia/Colombo', 'Asia/Dacca' => 'Asia/Dacca', 'Asia/Damascus' => 'Asia/Damascus', 'Asia/Dhaka' => 'Asia/Dhaka', 'Asia/Dili' => 'Asia/Dili', 'Asia/Dubai' => 'Asia/Dubai', 'Asia/Dushanbe' => 'Asia/Dushanbe', 'Asia/Gaza' => 'Asia/Gaza', 'Asia/Harbin' => 'Asia/Harbin', 'Asia/Hong_Kong' => 'Asia/Hong Kong', 'Asia/Hovd' => 'Asia/Hovd', 'Asia/Irkutsk' => 'Asia/Irkutsk', 'Asia/Istanbul' => 'Asia/Istanbul', 'Asia/Jakarta' => 'Asia/Jakarta', 'Asia/Jayapura' => 'Asia/Jayapura', 'Asia/Jerusalem' => 'Asia/Jerusalem', //Offset 10800 'Asia/Kabul' => 'Asia/Kabul', 'Asia/Kamchatka' => 'Asia/Kamchatka', 'Asia/Karachi' => 'Asia/Karachi', 'Asia/Kashgar' => 'Asia/Kashgar', 'Asia/Katmandu' => 'Asia/Katmandu', 'Asia/Kolkata' => 'Asia/Kolkata', 'Asia/Krasnoyarsk' => 'Asia/Krasnoyarsk', 'Asia/Kuala_Lumpur' => 'Asia/Kuala Lumpur', 'Asia/Kuching' => 'Asia/Kuching', 'Asia/Kuwait' => 'Asia/Kuwait', 'Asia/Macao' => 'Asia/Macao', 'Asia/Magadan' => 'Asia/Magadan', 'Asia/Manila' => 'Asia/Manila', 'Asia/Nicosia' => 'Asia/Nicosia', 'Asia/Novosibirsk' => 'Asia/Novosibirsk', 'Asia/Omsk' => 'Asia/Omsk', 'Asia/Phnom_Penh' => 'Asia/Phnom Penh', 'Asia/Pontianak' => 'Asia/Pontianak', 'Asia/Pyongyang' => 'Asia/Pyongyang', 'Asia/Qatar' => 'Asia/Qatar', 'Asia/Rangoon' => 'Asia/Rangoon', 'Asia/Riyadh' => 'Asia/Riyadh', 'Asia/Saigon' => 'Asia/Saigon', 'Asia/Sakhalin' => 'Asia/Sakhalin', 'Asia/Samarkand' => 'Asia/Samarkand', 'Asia/Seoul' => 'Asia/Seoul', 'Asia/Shanghai' => 'Asia/Shanghai', 'Asia/Singapore' => 'Asia/Singapore', 'Asia/Taipei' => 'Asia/Taipei', 'Asia/Tashkent' => 'Asia/Tashkent', 'Asia/Tbilisi' => 'Asia/Tbilisi', 'Asia/Tehran' => 'Asia/Tehran', 'Asia/Thimbu' => 'Asia/Thimbu', 'Asia/Thimphu' => 'Asia/Thimphu', 'Asia/Tokyo' => 'Asia/Tokyo', 'Asia/Ulaanbaatar' => 'Asia/Ulaanbaatar', 'Asia/Ulan_Bator' => 'Asia/Ulan Bator', 'Asia/Urumqi' => 'Asia/Urumqi', 'Asia/Vientiane' => 'Asia/Vientiane', 'Asia/Vladivostok' => 'Asia/Vladivostok', 'Asia/Yakutsk' => 'Asia/Yakutsk', 'Asia/Yekaterinburg' => 'Asia/Yekaterinburg', 'Asia/Yerevan' => 'Asia/Yerevan', 'Atlantic/Azores' => 'Atlantic/Azores', 'Atlantic/Bermuda' => 'Atlantic/Bermuda', 'Atlantic/Canary' => 'Atlantic/Canary', 'Atlantic/Cape_Verde' => 'Atlantic/Cape Verde', 'Atlantic/Jan_Mayen' => 'Atlantic/Jan Mayen', 'Atlantic/Madeira' => 'Atlantic/Madeira', 'Atlantic/Reykjavik' => 'Atlantic/Reykjavik', 'Atlantic/South_Georgia' => 'Atlantic/South Georgia', 'Atlantic/St_Helena' => 'Atlantic/St Helena', 'Atlantic/Stanley' => 'Atlantic/Stanley', 'Australia/Adelaide' => 'Australia/Adelaide', 'Australia/Brisbane' => 'Australia/Brisbane', 'Australia/Broken_Hill' => 'Australia/Broken Hill', 'Australia/Canberra' => 'Australia/Canberra', 'Australia/Darwin' => 'Australia/Darwin', 'Australia/Hobart' => 'Australia/Hobart', 'Australia/Lindeman' => 'Australia/Lindeman', 'Australia/Lord_Howe' => 'Australia/Lord Howe', 'Australia/Melbourne' => 'Australia/Melbourne', 'Australia/Perth' => 'Australia/Perth', 'Australia/Sydney' => 'Australia/Sydney', 'Australia/Yancowinna' => 'Australia/Yancowinna', 'Europe/Amsterdam' => 'Europe/Amsterdam', 'Europe/Andorra' => 'Europe/Andorra', 'Europe/Athens' => 'Europe/Athens', 'Europe/Belfast' => 'Europe/Belfast', 'Europe/Belgrade' => 'Europe/Belgrade', 'Europe/Berlin' => 'Europe/Berlin', 'Europe/Bratislava' => 'Europe/Bratislava', 'Europe/Brussels' => 'Europe/Brussels', 'Europe/Bucharest' => 'Europe/Bucharest', 'Europe/Budapest' => 'Europe/Budapest', 'Europe/Chisinau' => 'Europe/Chisinau', 'Europe/Copenhagen' => 'Europe/Copenhagen', 'Europe/Dublin' => 'Europe/Dublin', 'Europe/Gibraltar' => 'Europe/Gibraltar', 'Europe/Helsinki' => 'Europe/Helsinki', 'Europe/Istanbul' => 'Europe/Istanbul', 'Europe/Kaliningrad' => 'Europe/Kaliningrad', 'Europe/Kiev' => 'Europe/Kiev', 'Europe/Lisbon' => 'Europe/Lisbon', 'Europe/Ljubljana' => 'Europe/Ljubljana', 'Europe/London' => 'Europe/London', 'Europe/Luxembourg' => 'Europe/Luxembourg', 'Europe/Madrid' => 'Europe/Madrid', 'Europe/Malta' => 'Europe/Malta', 'Europe/Minsk' => 'Europe/Minsk', 'Europe/Monaco' => 'Europe/Monaco', 'Europe/Moscow' => 'Europe/Moscow', 'Europe/Nicosia' => 'Europe/Nicosia', 'Europe/Oslo' => 'Europe/Oslo', 'Europe/Paris' => 'Europe/Paris', 'Europe/Prague' => 'Europe/Prague', 'Europe/Riga' => 'Europe/Riga', 'Europe/Rome' => 'Europe/Rome', 'Europe/Samara' => 'Europe/Samara', 'Europe/San_Marino' => 'Europe/San Marino', 'Europe/Sarajevo' => 'Europe/Sarajevo', 'Europe/Simferopol' => 'Europe/Simferopol', 'Europe/Skopje' => 'Europe/Skopje', 'Europe/Sofia' => 'Europe/Sofia', 'Europe/Stockholm' => 'Europe/Stockholm', 'Europe/Tallinn' => 'Europe/Tallinn', 'Europe/Tirane' => 'Europe/Tirane', 'Europe/Tiraspol' => 'Europe/Tiraspol', 'Europe/Uzhgorod' => 'Europe/Uzhgorod', 'Europe/Vaduz' => 'Europe/Vaduz', 'Europe/Vatican' => 'Europe/Vatican', 'Europe/Vienna' => 'Europe/Vienna', 'Europe/Vilnius' => 'Europe/Vilnius', 'Europe/Warsaw' => 'Europe/Warsaw', 'Europe/Zagreb' => 'Europe/Zagreb', 'Europe/Zaporozhye' => 'Europe/Zaporozhye', 'Europe/Zurich' => 'Europe/Zurich', '-1000-Asia/Calcutta' => 'India', //GMT+5:30, same as Asia Calcutta 'Indian/Antananarivo' => 'Indian/Antananarivo', 'Indian/Chagos' => 'Indian/Chagos', 'Indian/Christmas' => 'Indian/Christmas', 'Indian/Cocos' => 'Indian/Cocos', 'Indian/Comoro' => 'Indian/Comoro', 'Indian/Kerguelen' => 'Indian/Kerguelen', 'Indian/Mahe' => 'Indian/Mahe', 'Indian/Maldives' => 'Indian/Maldives', 'Indian/Mauritius' => 'Indian/Mauritius', 'Indian/Mayotte' => 'Indian/Mayotte', 'Indian/Reunion' => 'Indian/Reunion', 'Pacific/Apia' => 'Pacific/Apia', 'Pacific/Auckland' => 'Pacific/Auckland', 'Pacific/Chatham' => 'Pacific/Chatham', 'Pacific/Easter' => 'Pacific/Easter', 'Pacific/Efate' => 'Pacific/Efate', 'Pacific/Enderbury' => 'Pacific/Enderbury', 'Pacific/Fakaofo' => 'Pacific/Fakaofo', 'Pacific/Fiji' => 'Pacific/Fiji', 'Pacific/Funafuti' => 'Pacific/Funafuti', 'Pacific/Galapagos' => 'Pacific/Galapagos', 'Pacific/Gambier' => 'Pacific/Gambier', 'Pacific/Guadalcanal' => 'Pacific/Guadalcanal', 'Pacific/Guam' => 'Pacific/Guam', 'Pacific/Honolulu' => 'Pacific/Honolulu', 'Pacific/Johnston' => 'Pacific/Johnston', 'Pacific/Kiritimati' => 'Pacific/Kiritimati', 'Pacific/Kosrae' => 'Pacific/Kosrae', 'Pacific/Kwajalein' => 'Pacific/Kwajalein', 'Pacific/Majuro' => 'Pacific/Majuro', 'Pacific/Marquesas' => 'Pacific/Marquesas', 'Pacific/Nauru' => 'Pacific/Nauru', 'Pacific/Niue' => 'Pacific/Niue', 'Pacific/Norfolk' => 'Pacific/Norfolk', 'Pacific/Noumea' => 'Pacific/Noumea', 'Pacific/Pago_Pago' => 'Pacific/Pago Pago', 'Pacific/Palau' => 'Pacific/Palau', 'Pacific/Pitcairn' => 'Pacific/Pitcairn', 'Pacific/Ponape' => 'Pacific/Ponape', 'Pacific/Port_Moresby' => 'Pacific/Port Moresby', 'Pacific/Rarotonga' => 'Pacific/Rarotonga', 'Pacific/Tahiti' => 'Pacific/Tahiti', 'Pacific/Tarawa' => 'Pacific/Tarawa', 'Pacific/Tongatapu' => 'Pacific/Tongatapu', 'Pacific/Truk' => 'Pacific/Truk', 'Pacific/Wake' => 'Pacific/Wake', 'Pacific/Wallis' => 'Pacific/Wallis', 'Pacific/Yap' => 'Pacific/Yap', 'Antarctica/Casey' => 'Antarctica/Casey', 'Antarctica/Davis' => 'Antarctica/Davis', 'Antarctica/DumontDUrville' => 'Antarctica/DumontDUrville', 'Antarctica/Mawson' => 'Antarctica/Mawson', 'Antarctica/McMurdo' => 'Antarctica/McMurdo', 'Antarctica/Palmer' => 'Antarctica/Palmer', 'Antarctica/South_Pole' => 'Antarctica/South Pole', 'Antarctica/Syowa' => 'Antarctica/Syowa', 'Antarctica/Vostok' => 'Antarctica/Vostok', 'Arctic/Longyearbyen' => 'Arctic/Longyearbyen', //POSIX standard states to invert the signs, so do this here for our users. 'Etc/GMT' => 'GMT', 'Etc/GMT-0' => 'GMT+0', 'Etc/GMT-1' => 'GMT+1', 'Etc/GMT-2' => 'GMT+2', 'Etc/GMT-3' => 'GMT+3', 'Etc/GMT-4' => 'GMT+4', 'Etc/GMT-5' => 'GMT+5', 'Etc/GMT-6' => 'GMT+6', 'Etc/GMT-7' => 'GMT+7', 'Etc/GMT-8' => 'GMT+8', 'Etc/GMT-9' => 'GMT+9', 'Etc/GMT-10' => 'GMT+10', 'Etc/GMT-11' => 'GMT+11', 'Etc/GMT-12' => 'GMT+12', 'Etc/GMT-13' => 'GMT+13', 'Etc/GMT-14' => 'GMT+14', 'Etc/GMT+0' => 'GMT-0', 'Etc/GMT+1' => 'GMT-1', 'Etc/GMT+2' => 'GMT-2', 'Etc/GMT+3' => 'GMT-3', 'Etc/GMT+4' => 'GMT-4', 'Etc/GMT+5' => 'GMT-5', 'Etc/GMT+6' => 'GMT-6', 'Etc/GMT+7' => 'GMT-7', 'Etc/GMT+8' => 'GMT-8', 'Etc/GMT+9' => 'GMT-9', 'Etc/GMT+10' => 'GMT-10', 'Etc/GMT+11' => 'GMT-11', 'Etc/GMT+12' => 'GMT-12', 'GMT' => 'GMT', 'UTC' => 'UTC', ]; if ( defined( 'TIMETREX_API' ) == true && TIMETREX_API == true ) { $retval = Misc::addSortPrefix( $retval ); } break; case 'deprecated_timezone': $retval = [ 'YST9YDT' => 'America/Yakutat', 'SystemV/YST9YDT' => 'America/Yakutat', 'AST4ADT' => 'Atlantic/Bermuda', 'SystemV/AST4ADT' => 'Atlantic/Bermuda', 'Australia/ACT' => 'Australia/Sydney', 'Australia/LHI' => 'Australia/Lord_Howe', 'Australia/North' => 'Australia/Darwin', 'Australia/NSW' => 'Australia/Sydney', 'Australia/Queensland' => 'Australia/Brisbane', 'Australia/South' => 'Australia/Adelaide', 'Australia/Tasmania' => 'Australia/Hobart', 'Australia/Victoria' => 'Australia/Melbourne', 'Australia/West' => 'Australia/Perth', 'Brazil/Acre' => 'America/Rio_Branco', 'Brazil/DeNoronha' => 'America/Noronha', 'Brazil/East' => 'America/Sao_Paulo', 'Brazil/West' => 'America/Manaus', 'Canada/Atlantic' => 'America/Halifax', 'Canada/Central' => 'America/Winnipeg', 'Canada/Eastern' => 'America/Toronto', 'Canada/Mountain' => 'America/Edmonton', 'Canada/Newfoundland' => 'America/St_Johns', 'Canada/Pacific' => 'America/Vancouver', 'Canada/Saskatchewan' => 'America/Regina', 'Canada/East-Saskatchewan' => 'America/Regina', 'Canada/Yukon' => 'America/Whitehorse', 'CET' => 'Europe/Paris', 'Chile/Continental' => 'America/Santiago', 'Chile/EasterIsland' => 'Pacific/Easter', 'CST5CDT' => 'America/Chicago', //Bogus timezone that was in use briefly. 'CST6CDT' => 'America/Chicago', 'Cuba' => 'America/Havana', 'EET' => 'Europe/Sofia', 'Egypt' => 'Africa/Cairo', 'Eire' => 'Europe/Dublin', 'EST' => 'America/Cancun', 'EST5EDT' => 'America/New_York', 'Etc/Greenwich' => 'GMT', 'Etc/UCT' => 'UTC', 'Etc/Universal' => 'UTC', 'Etc/Zulu' => 'UTC', 'GB' => 'Europe/London', 'GB-Eire' => 'Europe/London', 'GMT+0' => 'GMT', 'GMT0' => 'GMT', 'GMT-0' => 'GMT', 'Greenwich' => 'GMT', 'Hongkong' => 'Asia/Hong_Kong', 'HST' => 'Pacific/Honolulu', 'Iceland' => 'Atlantic/Reykjavik', 'Iran' => 'Asia/Tehran', 'Israel' => 'Asia/Jerusalem', 'Jamaica' => 'America/Jamaica', 'Japan' => 'Asia/Tokyo', 'Kwajalein' => 'Pacific/Kwajalein', 'Libya' => 'Africa/Tripoli', 'MET' => 'Europe/Paris', 'Mexico/BajaNorte' => 'America/Tijuana', 'Mexico/BajaSur' => 'America/Mazatlan', 'Mexico/General' => 'America/Mexico_City', 'MST' => 'America/Phoenix', 'MST7MDT' => 'America/Denver', 'Navajo' => 'America/Denver', 'NZ' => 'Pacific/Auckland', 'NZ-CHAT' => 'Pacific/Chatham', 'Poland' => 'Europe/Warsaw', 'Portugal' => 'Europe/Lisbon', 'PRC' => 'Asia/Shanghai', 'PST8PDT' => 'America/Los_Angeles', 'ROC' => 'Asia/Taipei', 'ROK' => 'Asia/Seoul', 'Singapore' => 'Asia/Singapore', 'Turkey' => 'Europe/Istanbul', 'UCT' => 'UTC', 'Universal' => 'UTC', 'US/Alaska' => 'America/Anchorage', 'US/Aleutian' => 'America/Adak', 'US/Arizona' => 'America/Phoenix', 'US/Central' => 'America/Chicago', 'US/Eastern' => 'America/New_York', 'US/East-Indiana' => 'America/Indiana/Indianapolis', 'US/Hawaii' => 'Pacific/Honolulu', 'US/Indiana-Starke' => 'America/Indiana/Knox', 'US/Michigan' => 'America/Detroit', 'US/Mountain' => 'America/Denver', 'US/Pacific' => 'America/Los_Angeles', 'US/Pacific-New' => 'America/Los_Angeles', 'US/Samoa' => 'Pacific/Pago_Pago', 'WET' => 'Europe/Lisbon', 'W-SU' => 'Europe/Moscow', 'Zulu' => 'UTC', ]; //If the parent is specified as a country, use country specific replacements. if ( is_array( $params ) && isset( $params['country'] ) && strtolower( $params['country'] ) == 'ca' ) { $retval = array_merge( $retval, [ 'YST9YDT' => 'America/Whitehorse', 'SystemV/YST9YDT' => 'America/Whitehorse', 'PST8PDT' => 'America/Vancouver', 'MST7MDT' => 'America/Edmonton', 'CST6CDT' => 'America/Winnipeg', 'CST5CDT' => 'America/Winnipeg', //Bogus timezone that was in use briefly. 'EST5EDT' => 'America/Toronto', 'AST4ADT' => 'America/Halifax', 'SystemV/AST4ADT' => 'America/Halifax', ] ); } break; case 'location_timezone': //Country/Province to TimeZone map. $retval = [ 'CA' => [ 'AB' => 'America/Edmonton', 'BC' => 'America/Vancouver', 'SK' => 'America/Regina', 'MB' => 'America/Winnipeg', 'QC' => 'America/Montreal', 'ON' => 'America/Toronto', 'NL' => 'America/St_Johns', 'NB' => 'America/Moncton', 'NS' => 'America/Halifax', 'PE' => 'America/Halifax', 'NT' => 'America/Yellowknife', 'YT' => 'America/Whitehorse', 'NU' => 'America/Toronto', ], 'US' => [ 'AL' => 'America/Chicago', 'AK' => 'America/Anchorage', //Hawaii 'AZ' => 'America/Phoenix', 'AR' => 'America/Chicago', 'CA' => 'America/Los_Angeles', 'CO' => 'America/Denver', 'CT' => 'America/New_York', 'DE' => 'America/New_York', 'DC' => 'America/New_York', 'FL' => [ 'America/New_York', 'America/Chicago' ], //Most common timezone first. 'GA' => 'America/New_York', 'HI' => 'Pacific/Honolulu', 'ID' => [ 'America/Denver', 'America/Los_Angeles' ], //Most common timezone first. 'IL' => 'America/Chicago', 'IN' => [ 'America/New_York', 'America/Chicago' ], 'IA' => 'America/Chicago', 'KS' => [ 'America/Chicago', 'America/Denver' ], 'KY' => [ 'America/New_York', 'America/Chicago' ], 'LA' => 'America/Chicago', 'ME' => 'America/New_York', 'MD' => 'America/New_York', 'MA' => 'America/New_York', 'MI' => [ 'America/New_York', 'America/Denver' ], 'MN' => 'America/Chicago', 'MS' => 'America/Chicago', 'MO' => 'America/Chicago', 'MT' => 'America/Denver', 'NE' => [ 'America/Chicago', 'America/Denver' ], 'NV' => 'America/Los_Angeles', 'NH' => 'America/New_York', 'NM' => 'America/Denver', 'NJ' => 'America/New_York', 'NY' => 'America/New_York', 'NC' => 'America/New_York', 'ND' => [ 'America/Chicago', 'America/Denver' ], 'OH' => 'America/New_York', 'OK' => 'America/Chicago', 'OR' => [ 'America/Los_Angeles', 'America/Denver' ], 'PA' => 'America/New_York', 'RI' => 'America/New_York', 'SC' => 'America/New_York', 'SD' => [ 'America/New_York', 'America/Denver' ], 'TN' => [ 'America/Chicago', 'America/New_York' ], 'TX' => [ 'America/Chicago', 'America/Denver' ], 'UT' => 'America/Denver', 'VT' => 'America/New_York', 'VA' => 'America/New_York', 'WA' => 'America/Los_Angeles', 'WV' => 'America/New_York', 'WI' => 'America/Chicago', 'WY' => 'America/Denver', ], 'AG' => 'America/Antigua', 'AI' => 'America/Anguilla', 'AW' => 'America/Aruba', 'BB' => 'America/Barbados', 'BL' => 'America/St_Barthelemy', 'BM' => 'Atlantic/Bermuda', 'BQ' => 'America/Kralendijk', 'BS' => 'America/Nassau', 'CU' => 'America/Havana', 'CW' => 'America/Curacao', 'DM' => 'America/Dominica', 'DO' => 'America/Santo_Domingo', 'GD' => 'America/Grenada', 'GP' => 'America/Guadeloupe', 'HT' => 'America/Port-au-Prince', 'JM' => 'America/Jamaica', 'KN' => 'America/St_Kitts', 'KY' => 'America/Cayman', 'LC' => 'America/St_Lucia', 'MF' => 'America/Marigot', 'MQ' => 'America/Martinique', 'MS' => 'America/Montserrat', 'MX' => 'America/Mexico_City', 'PR' => 'America/Puerto_Rico', 'SX' => 'America/Lower_Princes', 'TC' => 'America/Grand_Turk', 'TT' => 'America/Port_of_Spain', 'VC' => 'America/St_Vincent', 'VG' => 'America/Tortola', 'VI' => 'America/St_Thomas', ]; break; case 'area_code_timezone': //Area code to Country/Province/TimeZone map. $retval = [ //See area code recent changes here: https://www.areacodehelp.com/area-code-news/area-code-changes.shtml 211 => [ 'country' => 'US', 'province' => null, 'time_zone' => null ], // Local community info / referral services 242 => [ 'country' => 'BS', 'province' => null, 'time_zone' => 'America/New_York' ], // Bahamas 246 => [ 'country' => 'BB', 'province' => null, 'time_zone' => 'America/Nassau' ], // Barbados 264 => [ 'country' => 'AI', 'province' => null, 'time_zone' => 'America/Anguilla' ], // Anguilla (split from 809) 268 => [ 'country' => 'AG', 'province' => null, 'time_zone' => 'America/Antigua' ], // Antigua and Barbuda (split from 809) 284 => [ 'country' => 'VG', 'province' => null, 'time_zone' => 'America/Tortola' ], // British Virgin Islands (split from 809) 311 => [ 'country' => 'US', 'province' => null, 'time_zone' => null ], // Reserved for special applications 345 => [ 'country' => 'KY', 'province' => null, 'time_zone' => 'America/New_York' ], // Cayman Islands 411 => [ 'country' => 'US', 'province' => null, 'time_zone' => null ], // Reserved for special applications 441 => [ 'country' => 'BM', 'province' => null, 'time_zone' => 'Atlantic/Bermuda' ], // Bermuda (part of what used to be 809) 456 => [ 'country' => 'US', 'province' => null, 'time_zone' => null ], // Inbound International 473 => [ 'country' => 'GD', 'province' => null, 'time_zone' => 'America/Grenada' ], // Grenada ("new" -- split from 809) 500 => [ 'country' => 'US', 'province' => null, 'time_zone' => null ], // Personal Communication Service 511 => [ 'country' => 'US', 'province' => null, 'time_zone' => null ], // Nationwide travel information 555 => [ 'country' => 'US', 'province' => null, 'time_zone' => null ], // Reserved for directory assistance applications 600 => [ 'country' => 'US', 'province' => null, 'time_zone' => null ], // Canadian Services 611 => [ 'country' => 'US', 'province' => null, 'time_zone' => null ], // Reserved for special applications 649 => [ 'country' => 'TC', 'province' => null, 'time_zone' => 'America/New_York' ], // Turks & Caicos Islands 664 => [ 'country' => 'MS', 'province' => null, 'time_zone' => 'America/Montserrat' ], // Montserrat (split from 809) 684 => [ 'country' => 'AS', 'province' => null, 'time_zone' => null ], //1 American Samoa 700 => [ 'country' => 'US', 'province' => null, 'time_zone' => null ], // Interexchange Carrier Services 710 => [ 'country' => 'US', 'province' => null, 'time_zone' => null ], // US Government 711 => [ 'country' => 'US', 'province' => null, 'time_zone' => null ], // Telecommunications Relay Services 758 => [ 'country' => 'LC', 'province' => null, 'time_zone' => 'America/St_Lucia' ], // St. Lucia (split from 809) 767 => [ 'country' => 'DM', 'province' => null, 'time_zone' => 'America/Dominica' ], // Dominica (split from 809) 784 => [ 'country' => 'VC', 'province' => null, 'time_zone' => 'America/St_Vincent' ], // St. Vincent & Grenadines (split from 809) 800 => [ 'country' => 'US', 'province' => null, 'time_zone' => null ], // US/Canada toll free (see 888, 877, 866, 855, 844, 833, 822) 809 => [ 'country' => 'DO', 'province' => null, 'time_zone' => 'America/Santo_Domingo' ], // Dominican Republic (see splits 264, 268, 284, 340, 441, 473, 664, 758, 767, 784, 868, 876; overlay 829) 849 => [ 'country' => 'DO', 'province' => null, 'time_zone' => 'America/Santo_Domingo' ], // Dominican Republic (see splits 264, 268, 284, 340, 441, 473, 664, 758, 767, 784, 868, 876; overlay 829) 811 => [ 'country' => 'US', 'province' => null, 'time_zone' => null ], // Reserved for special applications 822 => [ 'country' => 'US', 'province' => null, 'time_zone' => null ], // US/Canada toll free (proposed, may not be in use yet) 829 => [ 'country' => 'DO', 'province' => null, 'time_zone' => 'America/Santo_Domingo' ], // Dominican Republic (perm 1/31/05; mand 8/1/05; overlaid on 809) 833 => [ 'country' => 'US', 'province' => null, 'time_zone' => null ], // US/Canada toll free (proposed, may not be in use yet) 844 => [ 'country' => 'US', 'province' => null, 'time_zone' => null ], // US/Canada toll free (proposed, may not be in use yet) 855 => [ 'country' => 'US', 'province' => null, 'time_zone' => null ], // US/Canada toll free (proposed, may not be in use yet) 866 => [ 'country' => 'US', 'province' => null, 'time_zone' => null ], // US/Canada toll free 868 => [ 'country' => 'TT', 'province' => null, 'time_zone' => 'America/Port_of_Spain' ], // Trinidad and Tobago ("new" -- see 809) 869 => [ 'country' => 'KN', 'province' => null, 'time_zone' => 'America/St_Kitts' ], // St. Kitts & Nevis 876 => [ 'country' => 'JM', 'province' => null, 'time_zone' => 'America/New_York' ], // Jamaica (split from 809) 658 => [ 'country' => 'JM', 'province' => null, 'time_zone' => 'America/New_York' ], // Jamaica (split from 876) 877 => [ 'country' => 'US', 'province' => null, 'time_zone' => null ], // US/Canada toll free 880 => [ 'country' => 'US', 'province' => null, 'time_zone' => null ], // Paid Toll-Free Service 881 => [ 'country' => 'US', 'province' => null, 'time_zone' => null ], // Paid Toll-Free Service 882 => [ 'country' => 'US', 'province' => null, 'time_zone' => null ], // Paid Toll-Free Service 888 => [ 'country' => 'US', 'province' => null, 'time_zone' => null ], // US/Canada toll free 898 => [ 'country' => 'US', 'province' => null, 'time_zone' => null ], // VoIP service 900 => [ 'country' => 'US', 'province' => null, 'time_zone' => null ], // US toll calls -- prices vary with the number called 911 => [ 'country' => 'US', 'province' => null, 'time_zone' => null ], // Emergency 976 => [ 'country' => 'US', 'province' => null, 'time_zone' => null ], // Unassigned 999 => [ 'country' => 'US', 'province' => null, 'time_zone' => null ], // Often used by carriers to indicate that the area code information is unavailable for CNID, even though the rest of the number is present 525 => [ 'country' => 'MX', 'province' => null, 'time_zone' => 'America/Mexico_City' ], //-6 Mexico: Mexico City area (country code + city code) 403 => [ 'country' => 'CA', 'province' => 'AB', 'time_zone' => 'America/Edmonton' ], // Canada: Southern Alberta (see 780, 867) 825 => [ 'country' => 'CA', 'province' => 'AB', 'time_zone' => 'America/Edmonton' ], // Canada: Southern Alberta 780 => [ 'country' => 'CA', 'province' => 'AB', 'time_zone' => 'America/Edmonton' ], // Canada: Northern Alberta, north of Lacombe (see 403) 587 => [ 'country' => 'CA', 'province' => 'AB', 'time_zone' => 'America/Edmonton' ], // Canada: Alberta 250 => [ 'country' => 'CA', 'province' => 'BC', 'time_zone' => 'America/Vancouver' ], ///-7 Canada: British Columbia (see 604) 236 => [ 'country' => 'CA', 'province' => 'BC', 'time_zone' => 'America/Vancouver' ], ///-7 Canada: British Columbia (see 604) 672 => [ 'country' => 'CA', 'province' => 'BC', 'time_zone' => 'America/Vancouver' ], ///-7 Canada: British Columbia (see 604) 604 => [ 'country' => 'CA', 'province' => 'BC', 'time_zone' => 'America/Vancouver' ], // Canada: British Columbia: Greater Vancouver (overlay 778, perm 11/3/01; see 250) 778 => [ 'country' => 'CA', 'province' => 'BC', 'time_zone' => 'America/Vancouver' ], // Canada: British Columbia: Greater Vancouver (overlaid on 604, per 11/3/01; see also 250) 204 => [ 'country' => 'CA', 'province' => 'MB', 'time_zone' => 'America/Winnipeg' ], // Canada: Manitoba 431 => [ 'country' => 'CA', 'province' => 'MB', 'time_zone' => 'America/Winnipeg' ], // Canada: Manitoba 506 => [ 'country' => 'CA', 'province' => 'NB', 'time_zone' => 'America/Moncton' ], // Canada: New Brunswick 226 => [ 'country' => 'CA', 'province' => 'ON', 'time_zone' => 'America/Toronto' ], // Canada: SW Ontario: Windsor (overlaid on 519; eff 6/06) 548 => [ 'country' => 'CA', 'province' => 'ON', 'time_zone' => 'America/Toronto' ], // Canada: SW Ontario 289 => [ 'country' => 'CA', 'province' => 'ON', 'time_zone' => 'America/Toronto' ], // Canada: S Cent. Ontario: Greater Toronto Area -- Durham, Halton, Hamilton-Wentworth, Niagara, Peel, York, and southern Simcoe County (excluding Toronto -- overlaid on 905, eff 6/9/01) 742 => [ 'country' => 'CA', 'province' => 'ON', 'time_zone' => 'America/Toronto' ], // Canada: S Cent. Ontario 416 => [ 'country' => 'CA', 'province' => 'ON', 'time_zone' => 'America/Toronto' ], // Canada: S Cent. Ontario: Toronto (see overlay 647, eff 3/5/01) 519 => [ 'country' => 'CA', 'province' => 'ON', 'time_zone' => 'America/Toronto' ], // Canada: SW Ontario: Windsor (see overlay 226) 613 => [ 'country' => 'CA', 'province' => 'ON', 'time_zone' => 'America/Toronto' ], // Canada: SE Ontario: Ottawa 343 => [ 'country' => 'CA', 'province' => 'ON', 'time_zone' => 'America/Toronto' ], // Canada: SE Ontario 647 => [ 'country' => 'CA', 'province' => 'ON', 'time_zone' => 'America/Toronto' ], // Canada: S Cent. Ontario: Toronto (overlaid on 416; eff 3/5/01) 437 => [ 'country' => 'CA', 'province' => 'ON', 'time_zone' => 'America/Toronto' ], // Canada: S Cent. Ontario 705 => [ 'country' => 'CA', 'province' => 'ON', 'time_zone' => 'America/Toronto' ], // Canada: NE Ontario: Sault Ste. Marie/N Ontario: N Bay, Sudbury 249 => [ 'country' => 'CA', 'province' => 'ON', 'time_zone' => 'America/Toronto' ], // Canada: NE Ontario 807 => [ 'country' => 'CA', 'province' => 'ON', 'time_zone' => null ], ///-6 Canada: W Ontario: Thunder Bay region to Manitoba border (**NON-SPECIFIC: EST, CST) 905 => [ 'country' => 'CA', 'province' => 'ON', 'time_zone' => 'America/Toronto' ], // Canada: S Cent. Ontario: Greater Toronto Area -- Durham, Halton, Hamilton-Wentworth, Niagara, Peel, York, and southern Simcoe County (excluding Toronto -- see overlay 289 [eff 6/9/01], splits 416, 647) 365 => [ 'country' => 'CA', 'province' => 'ON', 'time_zone' => 'America/Toronto' ], // Canada: S Cent. Ontario: Greater Toronto Area 418 => [ 'country' => 'CA', 'province' => 'QC', 'time_zone' => 'America/Montreal' ], ///-4 Canada: NE Quebec: Quebec 438 => [ 'country' => 'CA', 'province' => 'QC', 'time_zone' => 'America/Montreal' ], // Canada: SW Quebec: Montreal city (overlaid on 514, [delayed until 6/06] eff 10/10/03, mand 2/7/04) 450 => [ 'country' => 'CA', 'province' => 'QC', 'time_zone' => 'America/Montreal' ], ///-4 Canada: Southeastern Quebec; suburbs outside metro Montreal 579 => [ 'country' => 'CA', 'province' => 'QC', 'time_zone' => 'America/Montreal' ], ///-4 Canada: Southeastern Quebec; 514 => [ 'country' => 'CA', 'province' => 'QC', 'time_zone' => 'America/Montreal' ], // Canada: SW Quebec: Montreal city (see overlay 438, eff 10/10/03, mand 2/7/04) 819 => [ 'country' => 'CA', 'province' => 'QC', 'time_zone' => 'America/Montreal' ], // NW Quebec: Trois Rivieres, Sherbrooke, Outaouais (Gatineau, Hull), and the Laurentians (up to St Jovite / Tremblant) (see 867) 873 => [ 'country' => 'CA', 'province' => 'QC', 'time_zone' => 'America/Montreal' ], // NW Quebec 581 => [ 'country' => 'CA', 'province' => 'QC', 'time_zone' => 'America/Montreal' ], // Quebec 367 => [ 'country' => 'CA', 'province' => 'QC', 'time_zone' => 'America/Montreal' ], // Quebec 306 => [ 'country' => 'CA', 'province' => 'SK', 'time_zone' => 'America/Regina' ], ///-7* Canada: Saskatchewan 474 => [ 'country' => 'CA', 'province' => 'SK', 'time_zone' => 'America/Regina' ], ///-7* Canada: Saskatchewan 639 => [ 'country' => 'CA', 'province' => 'SK', 'time_zone' => 'America/Regina' ], ///-7* Canada: Saskatchewan 867 => [ 'country' => 'CA', 'province' => 'YT', 'time_zone' => null ], ///-6/-7/-8 Canada: Yukon, Northwest Territories, Nunavut (split from 403/819) (**NON-SPECIFIC: CST, MST, PST ) 709 => [ 'country' => 'CA', 'province' => 'NL', 'time_zone' => null ], ///-3.5 Canada: Newfoundland and Labrador (**NON-SPECIFIC: NST, AST) 902 => [ 'country' => 'CA', 'province' => 'NS', 'time_zone' => 'America/Halifax' ], // Canada: Nova Scotia, Prince Edward Island 782 => [ 'country' => 'CA', 'province' => 'NS', 'time_zone' => 'America/Halifax' ], // Canada: Nova Scotia, Prince Edward Island 907 => [ 'country' => 'US', 'province' => 'AK', 'time_zone' => 'America/Anchorage' ], // Alaska 205 => [ 'country' => 'US', 'province' => 'AL', 'time_zone' => 'America/Chicago' ], // Central Alabama (including Birmingham; excludes the southeastern corner of Alabama and the deep south; see splits 256 and 334) 659 => [ 'country' => 'US', 'province' => 'AL', 'time_zone' => 'America/Chicago' ], // Central Alabama 251 => [ 'country' => 'US', 'province' => 'AL', 'time_zone' => 'America/Chicago' ], // S Alabama: Mobile and coastal areas, Jackson, Evergreen, Monroeville (split from 334, eff 6/18/01; see also 205, 256) 256 => [ 'country' => 'US', 'province' => 'AL', 'time_zone' => 'America/Chicago' ], // E and N Alabama (Huntsville, Florence, Gadsden; split from 205; see also 334) 938 => [ 'country' => 'US', 'province' => 'AL', 'time_zone' => 'America/Chicago' ], // Alabama 334 => [ 'country' => 'US', 'province' => 'AL', 'time_zone' => 'America/Chicago' ], // S Alabama: Auburn/Opelika, Montgomery and coastal areas (part of what used to be 205; see also 256, split 251) 479 => [ 'country' => 'US', 'province' => 'AR', 'time_zone' => 'America/Chicago' ], // NW Arkansas: Fort Smith, Fayetteville, Springdale, Bentonville (SPLIt from 501, perm 1/19/02, mand 7/20/02) 501 => [ 'country' => 'US', 'province' => 'AR', 'time_zone' => 'America/Chicago' ], // Central Arkansas: Little Rock, Hot Springs, Conway (see split 479) 870 => [ 'country' => 'US', 'province' => 'AR', 'time_zone' => 'America/Chicago' ], // Arkansas: areas outside of west/central AR: Jonesboro, etc 480 => [ 'country' => 'US', 'province' => 'AZ', 'time_zone' => 'America/Phoenix' ], //* Arizona: East Phoenix (see 520; also Phoenix split 602, 623) 520 => [ 'country' => 'US', 'province' => 'AZ', 'time_zone' => 'America/Phoenix' ], //* SE Arizona: Tucson area (split from 602; see split 928) 602 => [ 'country' => 'US', 'province' => 'AZ', 'time_zone' => 'America/Phoenix' ], //* Arizona: Phoenix (see 520; also Phoenix split 480, 623) 623 => [ 'country' => 'US', 'province' => 'AZ', 'time_zone' => 'America/Phoenix' ], //* Arizona: West Phoenix (see 520; also Phoenix split 480, 602) 928 => [ 'country' => 'US', 'province' => 'AZ', 'time_zone' => 'America/Phoenix' ], //* Central and Northern Arizona: Prescott, Flagstaff, Yuma (split from 520) 209 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // Cent. California: Stockton (see split 559) 213 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // S California: Los Angeles (see 310, 323, 626, 818) 310 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // S California: Beverly Hills, West Hollywood, West Los Angeles (see split 562; overlay 424) 323 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // S California: Los Angeles (outside downtown: Hollywood; split from 213) 341 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // (overlay on 510; SUSPENDED) 369 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // Solano County (perm 12/2/00, mand 6/2/01) 408 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // Cent. Coastal California: San Jose (see overlay 669) 415 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // California: San Francisco County and Marin County on the north side of the Golden Gate Bridge, extending north to Sonoma County (see 650) 424 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // S California: Los Angeles (see split 562; overlaid on 310 mand 7/26/06) 442 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // Far north suburbs of San Diego (Oceanside, Escondido, SUSPENDED -- originally perm 10/21/00, mand 4/14/01) 510 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // California: Oakland, East Bay (see 925) 530 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // NE California: Eldorado County area, excluding Eldorado Hills itself: incl cities of Auburn, Chico, Redding, So. Lake Tahoe, Marysville, Nevada City/Grass Valley (split from 916) 559 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // Central California: Fresno (split from 209) 562 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // California: Long Beach (split from 310 Los Angeles) 619 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // S California: San Diego (see split 760; overlay 858, 935) 626 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // E S California: Pasadena (split from 818 Los Angeles) 627 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // No longer in use [was Napa, Sonoma counties (perm 10/13/01, mand 4/13/02); now 707] 628 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // (Region unknown; perm 10/21/00) 650 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // California: Peninsula south of San Francisco -- San Mateo County, parts of Santa Clara County (split from 415) 661 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // California: N Los Angeles, Mckittrick, Mojave, Newhall, Oildale, Palmdale, Taft, Tehachapi, Bakersfield, Earlimart, Lancaster (split from 805) 669 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // Cent. Coastal California: San Jose (rejected was: overlaid on 408) 707 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // NW California: Santa Rosa, Napa, Vallejo, American Canyon, Fairfield 714 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // North and Central Orange County (see split 949) 747 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // S California: Los Angeles, Agoura Hills, Calabasas, Hidden Hills, and Westlake Village (see 818; implementation suspended) 760 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // California: San Diego North County to Sierra Nevada (split from 619) 764 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // (overlay on 650; SUSPENDED) 805 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // S Cent. and Cent. Coastal California: Ventura County, Santa Barbara County: San Luis Obispo, Thousand Oaks, Carpinteria, Santa Barbara, Santa Maria, Lompoc, Santa Ynez Valley / Solvang (see 661 split) 820 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // S Cent. and Cent. Coastal California 818 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // S California: Los Angeles: San Fernando Valley (see 213, 310, 562, 626, 747) 831 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // California: central coast area from Santa Cruz through Monterey County 858 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // S California: San Diego (see split 760; overlay 619, 935) 909 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // California: Inland empire: San Bernardino (see split 951), Riverside 840 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // California 916 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // NE California: Sacramento, Walnut Grove, Lincoln, Newcastle and El Dorado Hills (split to 530) 279 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // NE California 925 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // California: Contra Costa area: Antioch, Concord, Pleasanton, Walnut Creek (split from 510) 935 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // S California: San Diego (see split 760; overlay 858, 619; assigned but not in use) 949 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // California: S Coastal Orange County (split from 714) 951 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // California: W Riverside County (split from 909; eff 7/17/04) 657 => [ 'country' => 'US', 'province' => 'CA', 'time_zone' => 'America/Los_Angeles' ], // California 303 => [ 'country' => 'US', 'province' => 'CO', 'time_zone' => 'America/Denver' ], // Central Colorado: Denver (see 970, also 720 overlay) 719 => [ 'country' => 'US', 'province' => 'CO', 'time_zone' => 'America/Denver' ], // SE Colorado: Pueblo, Colorado Springs 720 => [ 'country' => 'US', 'province' => 'CO', 'time_zone' => 'America/Denver' ], // Central Colorado: Denver (overlaid on 303) 970 => [ 'country' => 'US', 'province' => 'CO', 'time_zone' => 'America/Denver' ], // N and W Colorado (part of what used to be 303) 203 => [ 'country' => 'US', 'province' => 'CT', 'time_zone' => 'America/New_York' ], // Connecticut: Fairfield County and New Haven County; Bridgeport, New Haven (see 860) 475 => [ 'country' => 'US', 'province' => 'CT', 'time_zone' => 'America/New_York' ], // Connecticut: New Haven, Greenwich, southwestern (postponed; was perm 1/6/01; mand 3/1/01???) 860 => [ 'country' => 'US', 'province' => 'CT', 'time_zone' => 'America/New_York' ], // Connecticut: areas outside of Fairfield and New Haven Counties (split from 203, overlay 959) 959 => [ 'country' => 'US', 'province' => 'CT', 'time_zone' => 'America/New_York' ], // Connecticut: Hartford, New London (postponed; was overlaid on 860 perm 1/6/01; mand 3/1/01???) 202 => [ 'country' => 'US', 'province' => 'DC', 'time_zone' => 'America/New_York' ], // Washington, D.C. 302 => [ 'country' => 'US', 'province' => 'DE', 'time_zone' => 'America/New_York' ], // Delaware 239 => [ 'country' => 'US', 'province' => 'FL', 'time_zone' => 'America/New_York' ], // Florida (Lee, Collier, and Monroe Counties, excl the Keys; see 305; eff 3/11/02; mand 3/11/03) 305 => [ 'country' => 'US', 'province' => 'FL', 'time_zone' => 'America/New_York' ], // SE Florida: Miami, the Keys (see 786, 954; 239) 321 => [ 'country' => 'US', 'province' => 'FL', 'time_zone' => 'America/New_York' ], // Florida: Brevard County, Cape Canaveral area; Metro Orlando (split from 407) 352 => [ 'country' => 'US', 'province' => 'FL', 'time_zone' => 'America/New_York' ], // Florida: Gainesville area, Ocala, Crystal River (split from 904) 386 => [ 'country' => 'US', 'province' => 'FL', 'time_zone' => 'America/New_York' ], // N central Florida: Lake City (split from 904, perm 2/15/01, mand 11/5/01) 407 => [ 'country' => 'US', 'province' => 'FL', 'time_zone' => 'America/New_York' ], // Central Florida: Metro Orlando (see overlay 689, eff 7/02; split 321) 561 => [ 'country' => 'US', 'province' => 'FL', 'time_zone' => 'America/New_York' ], // S. Central Florida: Palm Beach County (West Palm Beach, Boca Raton, Vero Beach; see split 772, eff 2/11/02; mand 11/11/02) 689 => [ 'country' => 'US', 'province' => 'FL', 'time_zone' => 'America/New_York' ], // Central Florida: Metro Orlando (see overlay 321; overlaid on 407, assigned but not in use) 727 => [ 'country' => 'US', 'province' => 'FL', 'time_zone' => 'America/New_York' ], // Florida Tampa Metro: Saint Petersburg, Clearwater (Pinellas and parts of Pasco County; split from 813) 754 => [ 'country' => 'US', 'province' => 'FL', 'time_zone' => 'America/New_York' ], // Florida: Broward County area, incl Ft. Lauderdale (overlaid on 954; perm 8/1/01, mand 9/1/01) 772 => [ 'country' => 'US', 'province' => 'FL', 'time_zone' => 'America/New_York' ], // S. Central Florida: St. Lucie, Martin, and Indian River counties (split from 561; eff 2/11/02; mand 11/11/02) 786 => [ 'country' => 'US', 'province' => 'FL', 'time_zone' => 'America/New_York' ], // SE Florida, Monroe County (Miami; overlaid on 305) 813 => [ 'country' => 'US', 'province' => 'FL', 'time_zone' => 'America/New_York' ], // SW Florida: Tampa Metro (splits 727 St. Petersburg, Clearwater, and 941 Sarasota) 850 => [ 'country' => 'US', 'province' => 'FL', 'time_zone' => null ], ///-5 Florida panhandle, from east of Tallahassee to Pensacola (split from 904); western panhandle (Pensacola, Panama City) are UTC-6 (**NON-SPECIFIC: EST, CST) 448 => [ 'country' => 'US', 'province' => 'FL', 'time_zone' => null ], ///-5 Florida panhandle, from east of Tallahassee to Pensacola (split from 904); western panhandle (Pensacola, Panama City) are UTC-6 (**NON-SPECIFIC: EST, CST) 863 => [ 'country' => 'US', 'province' => 'FL', 'time_zone' => 'America/New_York' ], // Florida: Lakeland, Polk County (split from 941) 904 => [ 'country' => 'US', 'province' => 'FL', 'time_zone' => 'America/New_York' ], // N Florida: Jacksonville (see splits 352, 386, 850) 927 => [ 'country' => 'US', 'province' => 'FL', 'time_zone' => 'America/New_York' ], // Florida: Cellular coverage in Orlando area 941 => [ 'country' => 'US', 'province' => 'FL', 'time_zone' => 'America/New_York' ], // SW Florida: Sarasota and Manatee counties (part of what used to be 813; see split 863) 954 => [ 'country' => 'US', 'province' => 'FL', 'time_zone' => 'America/New_York' ], // Florida: Broward County area, incl Ft. Lauderdale (part of what used to be 305, see overlay 754) 229 => [ 'country' => 'US', 'province' => 'GA', 'time_zone' => 'America/New_York' ], // SW Georgia: Albany (split from 912; see also 478; perm 8/1/00) 404 => [ 'country' => 'US', 'province' => 'GA', 'time_zone' => 'America/New_York' ], // N Georgia: Atlanta and suburbs (see overlay 678, split 770) 470 => [ 'country' => 'US', 'province' => 'GA', 'time_zone' => 'America/New_York' ], // Georgia: Greater Atlanta Metropolitan Area (overlaid on 404/770/678; mand 9/2/01) 478 => [ 'country' => 'US', 'province' => 'GA', 'time_zone' => 'America/New_York' ], // Central Georgia: Macon (split from 912; see also 229; perm 8/1/00; mand 8/1/01) 678 => [ 'country' => 'US', 'province' => 'GA', 'time_zone' => 'America/New_York' ], // N Georgia: metropolitan Atlanta (overlay; see 404, 770) 706 => [ 'country' => 'US', 'province' => 'GA', 'time_zone' => 'America/New_York' ], // N Georgia: Columbus, Augusta (see overlay 762) 762 => [ 'country' => 'US', 'province' => 'GA', 'time_zone' => 'America/New_York' ], // N Georgia: Columbus, Augusta (overlaid on 706) 770 => [ 'country' => 'US', 'province' => 'GA', 'time_zone' => 'America/New_York' ], // Georgia: Atlanta suburbs: outside of I-285 ring road (part of what used to be 404; see also overlay 678) 912 => [ 'country' => 'US', 'province' => 'GA', 'time_zone' => 'America/New_York' ], // SE Georgia: Savannah (see splits 229, 478) 671 => [ 'country' => 'US', 'province' => 'GU', 'time_zone' => 'Pacific/Guam' ], //0* Guam 808 => [ 'country' => 'US', 'province' => 'HI', 'time_zone' => 'Pacific/Honolulu' ], //0* Hawaii 319 => [ 'country' => 'US', 'province' => 'IA', 'time_zone' => 'America/Chicago' ], // E Iowa: Cedar Rapids (see split 563) 515 => [ 'country' => 'US', 'province' => 'IA', 'time_zone' => 'America/Chicago' ], // Cent. Iowa: Des Moines (see split 641) 563 => [ 'country' => 'US', 'province' => 'IA', 'time_zone' => 'America/Chicago' ], // E Iowa: Davenport, Dubuque (split from 319, eff 3/25/01) 641 => [ 'country' => 'US', 'province' => 'IA', 'time_zone' => 'America/Chicago' ], // Iowa: Mason City, Marshalltown, Creston, Ottumwa (split from 515; perm 7/9/00) 712 => [ 'country' => 'US', 'province' => 'IA', 'time_zone' => 'America/Chicago' ], // W Iowa: Council Bluffs 208 => [ 'country' => 'US', 'province' => 'ID', 'time_zone' => null ], ///-8 Idaho (**NON-SPECIFIC: America/Denver, America/Los_Angeles) 986 => [ 'country' => 'US', 'province' => 'ID', 'time_zone' => 'America/Los_Angeles' ], ///-8 Idaho (**NON-SPECIFIC: America/Denver, America/Los_Angeles) 217 => [ 'country' => 'US', 'province' => 'IL', 'time_zone' => 'America/Chicago' ], // Cent. Illinois: Springfield 447 => [ 'country' => 'US', 'province' => 'IL', 'time_zone' => 'America/Chicago' ], // Cent. Illinois 224 => [ 'country' => 'US', 'province' => 'IL', 'time_zone' => 'America/Chicago' ], // Northern NE Illinois: Evanston, Waukegan, Northbrook (overlay on 847, eff 1/5/02) 309 => [ 'country' => 'US', 'province' => 'IL', 'time_zone' => 'America/Chicago' ], // W Cent. Illinois: Peoria 312 => [ 'country' => 'US', 'province' => 'IL', 'time_zone' => 'America/Chicago' ], // Illinois: Chicago (downtown only -- in the loop; see 773; overlay 872) 331 => [ 'country' => 'US', 'province' => 'IL', 'time_zone' => 'America/Chicago' ], // W NE Illinois, western suburbs of Chicago (part of what used to be 708; overlaid on 630; eff 7/07) 464 => [ 'country' => 'US', 'province' => 'IL', 'time_zone' => 'America/Chicago' ], // Illinois: south suburbs of Chicago (see 630; overlaid on 708) 618 => [ 'country' => 'US', 'province' => 'IL', 'time_zone' => 'America/Chicago' ], // S Illinois: Centralia 630 => [ 'country' => 'US', 'province' => 'IL', 'time_zone' => 'America/Chicago' ], // W NE Illinois, western suburbs of Chicago (part of what used to be 708; overlay 331) 708 => [ 'country' => 'US', 'province' => 'IL', 'time_zone' => 'America/Chicago' ], // Illinois: southern and western suburbs of Chicago (see 630; overlay 464) 773 => [ 'country' => 'US', 'province' => 'IL', 'time_zone' => 'America/Chicago' ], // Illinois: city of Chicago, outside the loop (see 312; overlay 872) 779 => [ 'country' => 'US', 'province' => 'IL', 'time_zone' => 'America/Chicago' ], // NW Illinois: Rockford, Kankakee (overlaid on 815; eff 8/19/06, mand 2/17/07) 815 => [ 'country' => 'US', 'province' => 'IL', 'time_zone' => 'America/Chicago' ], // NW Illinois: Rockford, Kankakee (see overlay 779; eff 8/19/06, mand 2/17/07) 847 => [ 'country' => 'US', 'province' => 'IL', 'time_zone' => 'America/Chicago' ], // Northern NE Illinois: northwestern suburbs of chicago (Evanston, Waukegan, Northbrook; see overlay 224) 872 => [ 'country' => 'US', 'province' => 'IL', 'time_zone' => 'America/Chicago' ], // Illinois: Chicago (downtown only -- in the loop; see 773; overlaid on 312 and 773) 219 => [ 'country' => 'US', 'province' => 'IN', 'time_zone' => null ], ///-5 NW Indiana: Gary (see split 574, 260) (**NON-SPECIFIC: EST, CST) 260 => [ 'country' => 'US', 'province' => 'IN', 'time_zone' => 'America/New_York' ], // NE Indiana: Fort Wayne (see 219) 317 => [ 'country' => 'US', 'province' => 'IN', 'time_zone' => 'America/New_York' ], // Cent. Indiana: Indianapolis (see 765) 463 => [ 'country' => 'US', 'province' => 'IN', 'time_zone' => 'America/New_York' ], // Cent. Indiana 574 => [ 'country' => 'US', 'province' => 'IN', 'time_zone' => null ], // N Indiana: Elkhart, South Bend (split from 219) (**NON-SPECIFIC: EST, CST) 765 => [ 'country' => 'US', 'province' => 'IN', 'time_zone' => 'America/New_York' ], // Indiana: outside Indianapolis (split from 317) 812 => [ 'country' => 'US', 'province' => 'IN', 'time_zone' => null ], ///-5 S Indiana: Evansville, Cincinnati outskirts in IN, Columbus, Bloomington (mostly GMT-5) (**NON-SPECIFIC: EST, CST) 930 => [ 'country' => 'US', 'province' => 'IN', 'time_zone' => 'America/New_York' ], ///-5 S Indiana 316 => [ 'country' => 'US', 'province' => 'KS', 'time_zone' => 'America/Chicago' ], // S Kansas: Wichita (see split 620) 620 => [ 'country' => 'US', 'province' => 'KS', 'time_zone' => null ], // S Kansas: Wichita (split from 316; perm 2/3/01) (**NON-SPECIFIC: CST, MST) 785 => [ 'country' => 'US', 'province' => 'KS', 'time_zone' => null ], // N & W Kansas: Topeka (split from 913) (**NON-SPECIFIC: CST, MST) 913 => [ 'country' => 'US', 'province' => 'KS', 'time_zone' => 'America/Chicago' ], // Kansas: Kansas City area (see 785) 270 => [ 'country' => 'US', 'province' => 'KY', 'time_zone' => null ], // W Kentucky: Bowling Green, Paducah (split from 502) (**NON-SPECIFIC: EST, CST) 502 => [ 'country' => 'US', 'province' => 'KY', 'time_zone' => 'America/New_York' ], // N Central Kentucky: Louisville (see 270) 606 => [ 'country' => 'US', 'province' => 'KY', 'time_zone' => null ], ///-6 E Kentucky: area east of Frankfort: Ashland (see 859) (**NON-SPECIFIC: EST, CST) 859 => [ 'country' => 'US', 'province' => 'KY', 'time_zone' => 'America/New_York' ], // N and Central Kentucky: Lexington; suburban KY counties of Cincinnati OH metro area; Covington, Newport, Ft. Thomas, Ft. Wright, Florence (split from 606) 364 => [ 'country' => 'US', 'province' => 'KY', 'time_zone' => null ], // (**NON-SPECIFIC: EST, CST) 225 => [ 'country' => 'US', 'province' => 'LA', 'time_zone' => 'America/Chicago' ], // Louisiana: Baton Rouge, New Roads, Donaldsonville, Albany, Gonzales, Greensburg, Plaquemine, Vacherie (split from 504) 318 => [ 'country' => 'US', 'province' => 'LA', 'time_zone' => 'America/Chicago' ], // N Louisiana: Shreveport, Ruston, Monroe, Alexandria (see split 337) 337 => [ 'country' => 'US', 'province' => 'LA', 'time_zone' => 'America/Chicago' ], // SW Louisiana: Lake Charles, Lafayette (see split 318) 504 => [ 'country' => 'US', 'province' => 'LA', 'time_zone' => 'America/Chicago' ], // E Louisiana: New Orleans metro area (see splits 225, 985) 985 => [ 'country' => 'US', 'province' => 'LA', 'time_zone' => 'America/Chicago' ], // E Louisiana: SE/N shore of Lake Pontchartrain: Hammond, Slidell, Covington, Amite, Kentwood, area SW of New Orleans, Houma, Thibodaux, Morgan City (split from 504; perm 2/12/01; mand 10/22/01) 339 => [ 'country' => 'US', 'province' => 'MA', 'time_zone' => 'America/New_York' ], // Massachusetts: Boston suburbs, to the south and west (see splits 617, 508; overlaid on 781, eff 5/2/01) 351 => [ 'country' => 'US', 'province' => 'MA', 'time_zone' => 'America/New_York' ], // Massachusetts: north of Boston to NH, 508, and 781 (overlaid on 978, eff 4/2/01) 413 => [ 'country' => 'US', 'province' => 'MA', 'time_zone' => 'America/New_York' ], // W Massachusetts: Springfield 508 => [ 'country' => 'US', 'province' => 'MA', 'time_zone' => 'America/New_York' ], // Cent. Massachusetts: Framingham; Cape Cod (see split 978, overlay 774) 617 => [ 'country' => 'US', 'province' => 'MA', 'time_zone' => 'America/New_York' ], // Massachusetts: greater Boston (see overlay 857) 774 => [ 'country' => 'US', 'province' => 'MA', 'time_zone' => 'America/New_York' ], // Cent. Massachusetts: Framingham; Cape Cod (see split 978, overlaid on 508, eff 4/2/01) 781 => [ 'country' => 'US', 'province' => 'MA', 'time_zone' => 'America/New_York' ], // Massachusetts: Boston surburbs, to the north and west (see splits 617, 508; overlay 339) 857 => [ 'country' => 'US', 'province' => 'MA', 'time_zone' => 'America/New_York' ], // Massachusetts: greater Boston (overlaid on 617, eff 4/2/01) 978 => [ 'country' => 'US', 'province' => 'MA', 'time_zone' => 'America/New_York' ], // Massachusetts: north of Boston to NH (see split 978 -- this is the northern half of old 508; see overlay 351) 240 => [ 'country' => 'US', 'province' => 'MD', 'time_zone' => 'America/New_York' ], // W Maryland: Silver Spring, Frederick, Gaithersburg (overlay, see 301) 301 => [ 'country' => 'US', 'province' => 'MD', 'time_zone' => 'America/New_York' ], // W Maryland: Silver Spring, Frederick, Camp Springs, Prince George's County (see 240) 410 => [ 'country' => 'US', 'province' => 'MD', 'time_zone' => 'America/New_York' ], // E Maryland: Baltimore, Annapolis, Chesapeake Bay area, Ocean City (see 443) 443 => [ 'country' => 'US', 'province' => 'MD', 'time_zone' => 'America/New_York' ], // E Maryland: Baltimore, Annapolis, Chesapeake Bay area, Ocean City (overlaid on 410) 207 => [ 'country' => 'US', 'province' => 'ME', 'time_zone' => 'America/New_York' ], // Maine 231 => [ 'country' => 'US', 'province' => 'MI', 'time_zone' => 'America/New_York' ], // W Michigan: Northwestern portion of lower Peninsula; Traverse City, Muskegon, Cheboygan, Alanson 248 => [ 'country' => 'US', 'province' => 'MI', 'time_zone' => 'America/New_York' ], // Michigan: Oakland County, Pontiac (split from 810; see overlay 947) 269 => [ 'country' => 'US', 'province' => 'MI', 'time_zone' => 'America/New_York' ], // SW Michigan: Kalamazoo, Saugatuck, Hastings, Battle Creek, Sturgis to Lake Michigan (split from 616) 278 => [ 'country' => 'US', 'province' => 'MI', 'time_zone' => 'America/New_York' ], // Michigan (overlaid on 734, SUSPENDED) 313 => [ 'country' => 'US', 'province' => 'MI', 'time_zone' => 'America/New_York' ], // Michigan: Detroit and suburbs (see 734, overlay 679) 517 => [ 'country' => 'US', 'province' => 'MI', 'time_zone' => 'America/New_York' ], // Cent. Michigan: Lansing (see split 989) 586 => [ 'country' => 'US', 'province' => 'MI', 'time_zone' => 'America/New_York' ], // Michigan: Macomb County (split from 810; perm 9/22/01, mand 3/23/02) 616 => [ 'country' => 'US', 'province' => 'MI', 'time_zone' => 'America/New_York' ], // W Michigan: Holland, Grand Haven, Greenville, Grand Rapids, Ionia (see split 269) 679 => [ 'country' => 'US', 'province' => 'MI', 'time_zone' => 'America/New_York' ], ///-6 Michigan: Dearborn area (overlaid on 313; assigned but not in use) 734 => [ 'country' => 'US', 'province' => 'MI', 'time_zone' => 'America/New_York' ], // SE Michigan: west and south of Detroit -- Ann Arbor, Monroe (split from 313) 810 => [ 'country' => 'US', 'province' => 'MI', 'time_zone' => 'America/New_York' ], // E Michigan: Flint, Pontiac (see 248; split 586) 906 => [ 'country' => 'US', 'province' => 'MI', 'time_zone' => null ], ///-5 Upper Peninsula Michigan: Sault Ste. Marie, Escanaba, Marquette (UTC-6 towards the WI border) (**NON-SPECIFIC: EST, CST) 947 => [ 'country' => 'US', 'province' => 'MI', 'time_zone' => 'America/New_York' ], ///-6 Michigan: Oakland County (overlays 248, perm 5/5/01) 989 => [ 'country' => 'US', 'province' => 'MI', 'time_zone' => 'America/New_York' ], // Upper central Michigan: Mt Pleasant, Saginaw (split from 517; perm 4/7/01) 218 => [ 'country' => 'US', 'province' => 'MN', 'time_zone' => 'America/Chicago' ], // N Minnesota: Duluth 320 => [ 'country' => 'US', 'province' => 'MN', 'time_zone' => 'America/Chicago' ], // Cent. Minnesota: Saint Cloud (rural Minn, excl St. Paul/Minneapolis) 507 => [ 'country' => 'US', 'province' => 'MN', 'time_zone' => 'America/Chicago' ], // S Minnesota: Rochester, Mankato, Worthington 612 => [ 'country' => 'US', 'province' => 'MN', 'time_zone' => 'America/Chicago' ], // Cent. Minnesota: Minneapolis (split from St. Paul, see 651; see splits 763, 952) 651 => [ 'country' => 'US', 'province' => 'MN', 'time_zone' => 'America/Chicago' ], // Cent. Minnesota: St. Paul (split from Minneapolis, see 612) 763 => [ 'country' => 'US', 'province' => 'MN', 'time_zone' => 'America/Chicago' ], // Minnesota: Minneapolis NW (split from 612; see also 952) 952 => [ 'country' => 'US', 'province' => 'MN', 'time_zone' => 'America/Chicago' ], // Minnesota: Minneapolis SW, Bloomington (split from 612; see also 763) 314 => [ 'country' => 'US', 'province' => 'MO', 'time_zone' => 'America/Chicago' ], // SE Missouri: St Louis city and parts of the metro area only (see 573, 636, overlay 557) 417 => [ 'country' => 'US', 'province' => 'MO', 'time_zone' => 'America/Chicago' ], // SW Missouri: Springfield 557 => [ 'country' => 'US', 'province' => 'MO', 'time_zone' => 'America/Chicago' ], // SE Missouri: St Louis metro area only (cancelled: overlaid on 314) 573 => [ 'country' => 'US', 'province' => 'MO', 'time_zone' => 'America/Chicago' ], // SE Missouri: excluding St Louis metro area, includes Central/East Missouri, area between St. Louis and Kansas City 636 => [ 'country' => 'US', 'province' => 'MO', 'time_zone' => 'America/Chicago' ], // Missouri: W St. Louis metro area of St. Louis county, St. Charles County, Jefferson County area south (between 314 and 573) 660 => [ 'country' => 'US', 'province' => 'MO', 'time_zone' => 'America/Chicago' ], // N Missouri (split from 816) 816 => [ 'country' => 'US', 'province' => 'MO', 'time_zone' => 'America/Chicago' ], // N Missouri: Kansas City (see split 660, overlay 975) 975 => [ 'country' => 'US', 'province' => 'MO', 'time_zone' => 'America/Chicago' ], // N Missouri: Kansas City (overlaid on 816) 670 => [ 'country' => 'US', 'province' => 'MP', 'time_zone' => null ], //0* Commonwealth of the Northern Mariana Islands (CNMI, US Commonwealth) 228 => [ 'country' => 'US', 'province' => 'MS', 'time_zone' => 'America/Chicago' ], // S Mississippi (coastal areas, Biloxi, Gulfport; split from 601) 601 => [ 'country' => 'US', 'province' => 'MS', 'time_zone' => 'America/Chicago' ], // Mississippi: Meridian, Jackson area (see splits 228, 662; overlay 769) 662 => [ 'country' => 'US', 'province' => 'MS', 'time_zone' => 'America/Chicago' ], // N Mississippi: Tupelo, Grenada (split from 601) 769 => [ 'country' => 'US', 'province' => 'MS', 'time_zone' => 'America/Chicago' ], // Mississippi: Meridian, Jackson area (overlaid on 601; perm 7/19/04, mand 3/14/05) 406 => [ 'country' => 'US', 'province' => 'MT', 'time_zone' => 'America/Denver' ], // Montana 252 => [ 'country' => 'US', 'province' => 'NC', 'time_zone' => 'America/New_York' ], // E North Carolina (Rocky Mount; split from 919) 336 => [ 'country' => 'US', 'province' => 'NC', 'time_zone' => 'America/New_York' ], // Cent. North Carolina: Greensboro, Winston-Salem, High Point (split from 910) 743 => [ 'country' => 'US', 'province' => 'NC', 'time_zone' => 'America/New_York' ], // Cent. North Carolina 704 => [ 'country' => 'US', 'province' => 'NC', 'time_zone' => 'America/New_York' ], // W North Carolina: Charlotte (see split 828, overlay 980) 828 => [ 'country' => 'US', 'province' => 'NC', 'time_zone' => 'America/New_York' ], // W North Carolina: Asheville (split from 704) 910 => [ 'country' => 'US', 'province' => 'NC', 'time_zone' => 'America/New_York' ], // S Cent. North Carolina: Fayetteville, Wilmington (see 336) 919 => [ 'country' => 'US', 'province' => 'NC', 'time_zone' => 'America/New_York' ], // E North Carolina: Raleigh (see split 252, overlay 984) 980 => [ 'country' => 'US', 'province' => 'NC', 'time_zone' => 'America/New_York' ], // North Carolina: (overlay on 704; perm 5/1/00, mand 3/15/01) 984 => [ 'country' => 'US', 'province' => 'NC', 'time_zone' => 'America/New_York' ], // E North Carolina: Raleigh (overlaid on 919, perm 8/1/01, mand 2/5/02 POSTPONED) 701 => [ 'country' => 'US', 'province' => 'ND', 'time_zone' => null ], // North Dakota (**NON-SPECIFIC: CST, MST) 308 => [ 'country' => 'US', 'province' => 'NE', 'time_zone' => null ], // -7 W Nebraska: North Platte (**NON-SPECIFIC: America/Chicago, America/Denver) 402 => [ 'country' => 'US', 'province' => 'NE', 'time_zone' => 'America/Chicago' ], // E Nebraska: Omaha, Lincoln 531 => [ 'country' => 'US', 'province' => 'NE', 'time_zone' => 'America/Chicago' ], // E Nebraska: Omaha, Lincoln (Similar to 402 Area Code) 603 => [ 'country' => 'US', 'province' => 'NH', 'time_zone' => 'America/New_York' ], // New Hampshire 201 => [ 'country' => 'US', 'province' => 'NJ', 'time_zone' => 'America/New_York' ], // N New Jersey: Jersey City, Hackensack (see split 973, overlay 551) 551 => [ 'country' => 'US', 'province' => 'NJ', 'time_zone' => 'America/New_York' ], // N New Jersey: Jersey City, Hackensack (overlaid on 201) 609 => [ 'country' => 'US', 'province' => 'NJ', 'time_zone' => 'America/New_York' ], // S New Jersey: Trenton (see 856) 640 => [ 'country' => 'US', 'province' => 'NJ', 'time_zone' => 'America/New_York' ], // S New Jersey 732 => [ 'country' => 'US', 'province' => 'NJ', 'time_zone' => 'America/New_York' ], // Cent. New Jersey: Toms River, New Brunswick, Bound Brook (see overlay 848) 848 => [ 'country' => 'US', 'province' => 'NJ', 'time_zone' => 'America/New_York' ], // Cent. New Jersey: Toms River, New Brunswick, Bound Brook (see overlay 732) 856 => [ 'country' => 'US', 'province' => 'NJ', 'time_zone' => 'America/New_York' ], // SW New Jersey: greater Camden area, Mt Laurel (split from 609) 862 => [ 'country' => 'US', 'province' => 'NJ', 'time_zone' => 'America/New_York' ], // N New Jersey: Newark Paterson Morristown (overlaid on 973) 908 => [ 'country' => 'US', 'province' => 'NJ', 'time_zone' => 'America/New_York' ], // Cent. New Jersey: Elizabeth, Basking Ridge, Somerville, Bridgewater, Bound Brook 973 => [ 'country' => 'US', 'province' => 'NJ', 'time_zone' => 'America/New_York' ], // N New Jersey: Newark, Paterson, Morristown (see overlay 862; split from 201) 505 => [ 'country' => 'US', 'province' => 'NM', 'time_zone' => 'America/Denver' ], // North central and northwestern New Mexico (Albuquerque, Santa Fe, Los Alamos; see split 575, eff 10/07/07) 575 => [ 'country' => 'US', 'province' => 'NM', 'time_zone' => 'America/Denver' ], // New Mexico (Las Cruces, Alamogordo, Roswell; split from 505, eff 10/07/07) 957 => [ 'country' => 'US', 'province' => 'NM', 'time_zone' => 'America/Denver' ], // New Mexico (pending; region unknown) 702 => [ 'country' => 'US', 'province' => 'NV', 'time_zone' => 'America/Los_Angeles' ], // S. Nevada: Clark County, incl Las Vegas (see 775) 725 => [ 'country' => 'US', 'province' => 'NV', 'time_zone' => 'America/Los_Angeles' ], // S. Nevada 775 => [ 'country' => 'US', 'province' => 'NV', 'time_zone' => 'America/Los_Angeles' ], // N. Nevada: Reno (all of NV except Clark County area; see 702) 212 => [ 'country' => 'US', 'province' => 'NY', 'time_zone' => 'America/New_York' ], // New York City, New York (Manhattan; see 646, 718) 332 => [ 'country' => 'US', 'province' => 'NY', 'time_zone' => 'America/New_York' ], // New York City, New York 315 => [ 'country' => 'US', 'province' => 'NY', 'time_zone' => 'America/New_York' ], // N Cent. New York: Syracuse 680 => [ 'country' => 'US', 'province' => 'NY', 'time_zone' => 'America/New_York' ], // N Cent. New York 347 => [ 'country' => 'US', 'province' => 'NY', 'time_zone' => 'America/New_York' ], // New York (overlay for 718: NYC area, except Manhattan) 929 => [ 'country' => 'US', 'province' => 'NY', 'time_zone' => 'America/New_York' ], // New York 516 => [ 'country' => 'US', 'province' => 'NY', 'time_zone' => 'America/New_York' ], // New York: Nassau County, Long Island; Hempstead (see split 631) 518 => [ 'country' => 'US', 'province' => 'NY', 'time_zone' => 'America/New_York' ], // NE New York: Albany 838 => [ 'country' => 'US', 'province' => 'NY', 'time_zone' => 'America/New_York' ], // NE New York 585 => [ 'country' => 'US', 'province' => 'NY', 'time_zone' => 'America/New_York' ], // NW New York: Rochester (split from 716) 607 => [ 'country' => 'US', 'province' => 'NY', 'time_zone' => 'America/New_York' ], // S Cent. New York: Ithaca, Binghamton; Catskills 631 => [ 'country' => 'US', 'province' => 'NY', 'time_zone' => 'America/New_York' ], // New York: Suffolk County, Long Island; Huntington, Riverhead (split 516) 934 => [ 'country' => 'US', 'province' => 'NY', 'time_zone' => 'America/New_York' ], // New York 646 => [ 'country' => 'US', 'province' => 'NY', 'time_zone' => 'America/New_York' ], // New York (overlay 212/917) NYC: Manhattan only 716 => [ 'country' => 'US', 'province' => 'NY', 'time_zone' => 'America/New_York' ], // NW New York: Buffalo (see split 585) 718 => [ 'country' => 'US', 'province' => 'NY', 'time_zone' => 'America/New_York' ], // New York City, New York (Queens, Staten Island, The Bronx, and Brooklyn; see 212, 347) 845 => [ 'country' => 'US', 'province' => 'NY', 'time_zone' => 'America/New_York' ], // New York: Poughkeepsie; Nyack, Nanuet, Valley Cottage, New City, Putnam, Dutchess, Rockland, Orange, Ulster and parts of Sullivan counties in New York's lower Hudson Valley and Delaware County in the Catskills (see 914; perm 6/5/00) 914 => [ 'country' => 'US', 'province' => 'NY', 'time_zone' => 'America/New_York' ], // S New York: Westchester County (see 845) 917 => [ 'country' => 'US', 'province' => 'NY', 'time_zone' => 'America/New_York' ], // New York: New York City (cellular, see 646) 216 => [ 'country' => 'US', 'province' => 'OH', 'time_zone' => 'America/New_York' ], // Cleveland (see splits 330, 440) 234 => [ 'country' => 'US', 'province' => 'OH', 'time_zone' => 'America/New_York' ], // NE Ohio: Canton, Akron (overlaid on 330; perm 10/30/00) 283 => [ 'country' => 'US', 'province' => 'OH', 'time_zone' => 'America/New_York' ], // SW Ohio: Cincinnati (cancelled: overlaid on 513) 330 => [ 'country' => 'US', 'province' => 'OH', 'time_zone' => 'America/New_York' ], // NE Ohio: Akron, Canton, Youngstown; Mahoning County, parts of Trumbull/Warren counties (see splits 216, 440, overlay 234) 380 => [ 'country' => 'US', 'province' => 'OH', 'time_zone' => 'America/New_York' ], // Ohio: Columbus (overlaid on 614; assigned but not in use) 419 => [ 'country' => 'US', 'province' => 'OH', 'time_zone' => 'America/New_York' ], // NW Ohio: Toledo (see overlay 567, perm 1/1/02) 440 => [ 'country' => 'US', 'province' => 'OH', 'time_zone' => 'America/New_York' ], // Ohio: Cleveland metro area, excluding Cleveland (split from 216, see also 330) 513 => [ 'country' => 'US', 'province' => 'OH', 'time_zone' => 'America/New_York' ], // SW Ohio: Cincinnati (see split 937; overlay 283 cancelled) 567 => [ 'country' => 'US', 'province' => 'OH', 'time_zone' => 'America/New_York' ], // NW Ohio: Toledo (overlaid on 419, perm 1/1/02) 614 => [ 'country' => 'US', 'province' => 'OH', 'time_zone' => 'America/New_York' ], // SE Ohio: Columbus (see overlay 380) 740 => [ 'country' => 'US', 'province' => 'OH', 'time_zone' => 'America/New_York' ], // SE Ohio (rural areas outside Columbus; split from 614) 220 => [ 'country' => 'US', 'province' => 'OH', 'time_zone' => 'America/New_York' ], // SE Ohio 937 => [ 'country' => 'US', 'province' => 'OH', 'time_zone' => 'America/New_York' ], // SW Ohio: Dayton (part of what used to be 513) 326 => [ 'country' => 'US', 'province' => 'OH', 'time_zone' => 'America/New_York' ], // SW Ohio 405 => [ 'country' => 'US', 'province' => 'OK', 'time_zone' => 'America/Chicago' ], // W Oklahoma: Oklahoma City (see 580) 572 => [ 'country' => 'US', 'province' => 'OK', 'time_zone' => 'America/Chicago' ], // W Oklahoma 580 => [ 'country' => 'US', 'province' => 'OK', 'time_zone' => 'America/Chicago' ], // W Oklahoma (rural areas outside Oklahoma City; split from 405) 918 => [ 'country' => 'US', 'province' => 'OK', 'time_zone' => 'America/Chicago' ], // E Oklahoma: Tulsa 539 => [ 'country' => 'US', 'province' => 'OK', 'time_zone' => 'America/Chicago' ], // E Oklahoma: 503 => [ 'country' => 'US', 'province' => 'OR', 'time_zone' => 'America/Los_Angeles' ], // Oregon (see 541, 971) 541 => [ 'country' => 'US', 'province' => 'OR', 'time_zone' => null ], ///-7 Oregon: Eugene, Medford (split from 503; 503 retains NW part [Portland/Salem], all else moves to 541; eastern oregon is UTC-7) (**NON-SPECIFIC: MST, PST) 971 => [ 'country' => 'US', 'province' => 'OR', 'time_zone' => 'America/Los_Angeles' ], // Oregon: Metropolitan Portland, Salem/Keizer area, incl Cricket Wireless (see 503; perm 10/1/00) 458 => [ 'country' => 'US', 'province' => 'OR', 'time_zone' => null ], // Oregon: (**NON-SPECIFIC: MST, PST) 215 => [ 'country' => 'US', 'province' => 'PA', 'time_zone' => 'America/New_York' ], // SE Pennsylvania: Philadelphia (see overlays 267) 267 => [ 'country' => 'US', 'province' => 'PA', 'time_zone' => 'America/New_York' ], // SE Pennsylvania: Philadelphia (see 215) 445 => [ 'country' => 'US', 'province' => 'PA', 'time_zone' => 'America/New_York' ], // SE Pennsylvania 412 => [ 'country' => 'US', 'province' => 'PA', 'time_zone' => 'America/New_York' ], // W Pennsylvania: Pittsburgh (see split 724, overlay 878) 484 => [ 'country' => 'US', 'province' => 'PA', 'time_zone' => 'America/New_York' ], // SE Pennsylvania: Allentown, Bethlehem, Reading, West Chester, Norristown (see 610) 570 => [ 'country' => 'US', 'province' => 'PA', 'time_zone' => 'America/New_York' ], // NE and N Central Pennsylvania: Wilkes-Barre, Scranton (see 717) 223 => [ 'country' => 'US', 'province' => 'PA', 'time_zone' => 'America/New_York' ], // NE and N Central Pennsylvania 272 => [ 'country' => 'US', 'province' => 'PA', 'time_zone' => 'America/New_York' ], // NE and N Central Pennsylvania 610 => [ 'country' => 'US', 'province' => 'PA', 'time_zone' => 'America/New_York' ], // SE Pennsylvania: Allentown, Bethlehem, Reading, West Chester, Norristown (see overlays 484, 835) 717 => [ 'country' => 'US', 'province' => 'PA', 'time_zone' => 'America/New_York' ], // E Pennsylvania: Harrisburg (see split 570) 724 => [ 'country' => 'US', 'province' => 'PA', 'time_zone' => 'America/New_York' ], // SW Pennsylvania (areas outside metro Pittsburgh; split from 412) 814 => [ 'country' => 'US', 'province' => 'PA', 'time_zone' => 'America/New_York' ], // Cent. Pennsylvania: Erie 582 => [ 'country' => 'US', 'province' => 'PA', 'time_zone' => 'America/New_York' ], // Cent. Pennsylvania 835 => [ 'country' => 'US', 'province' => 'PA', 'time_zone' => 'America/New_York' ], // SE Pennsylvania: Allentown, Bethlehem, Reading, West Chester, Norristown (overlaid on 610, eff 5/1/01; see also 484) 878 => [ 'country' => 'US', 'province' => 'PA', 'time_zone' => 'America/New_York' ], // Pittsburgh, New Castle (overlaid on 412, perm 8/17/01, mand t.b.a.) 787 => [ 'country' => 'US', 'province' => 'PR', 'time_zone' => 'America/Puerto_Rico' ], //* Puerto Rico (see overlay 939, perm 8/1/01) 939 => [ 'country' => 'US', 'province' => 'PR', 'time_zone' => 'America/Puerto_Rico' ], //* Puerto Rico (overlaid on 787, perm 8/1/01) 401 => [ 'country' => 'US', 'province' => 'RI', 'time_zone' => 'America/New_York' ], // Rhode Island 803 => [ 'country' => 'US', 'province' => 'SC', 'time_zone' => 'America/New_York' ], // South Carolina: Columbia, Aiken, Sumter (see 843, 864) 839 => [ 'country' => 'US', 'province' => 'SC', 'time_zone' => 'America/New_York' ], // South Carolina 843 => [ 'country' => 'US', 'province' => 'SC', 'time_zone' => 'America/New_York' ], // South Carolina, coastal area: Charleston, Beaufort, Myrtle Beach (split from 803) 854 => [ 'country' => 'US', 'province' => 'SC', 'time_zone' => 'America/New_York' ], // South Carolina 864 => [ 'country' => 'US', 'province' => 'SC', 'time_zone' => 'America/New_York' ], // South Carolina, upstate area: Greenville, Spartanburg (split from 803) 605 => [ 'country' => 'US', 'province' => 'SD', 'time_zone' => null ], ///-7 South Dakota (**NON-SPECIFIC: CST, MST) 423 => [ 'country' => 'US', 'province' => 'TN', 'time_zone' => null ], // E Tennessee, except Knoxville metro area: Chattanooga, Bristol, Johnson City, Kingsport, Greeneville (see split 865; part of what used to be 615) (**NON-SPECIFIC: EST, CST) 615 => [ 'country' => 'US', 'province' => 'TN', 'time_zone' => 'America/Chicago' ], // Northern Middle Tennessee: Nashville metro area (see 423, 931) 629 => [ 'country' => 'US', 'province' => 'TN', 'time_zone' => 'America/Chicago' ], // Northern Middle Tennessee 731 => [ 'country' => 'US', 'province' => 'TN', 'time_zone' => 'America/Chicago' ], // W Tennessee: outside Memphis metro area (split from 901, perm 2/12/01, mand 9/17/01) 865 => [ 'country' => 'US', 'province' => 'TN', 'time_zone' => 'America/New_York' ], // E Tennessee: Knoxville, Knox and adjacent counties (split from 423; part of what used to be 615) 901 => [ 'country' => 'US', 'province' => 'TN', 'time_zone' => 'America/Chicago' ], // W Tennessee: Memphis metro area (see 615, 931, split 731) 931 => [ 'country' => 'US', 'province' => 'TN', 'time_zone' => null ], // Middle Tennessee: semi-circular ring around Nashville (split from 615) (**NON-SPECIFIC: EST, CST) 210 => [ 'country' => 'US', 'province' => 'TX', 'time_zone' => 'America/Chicago' ], // S Texas: San Antonio (see also splits 830, 956) 726 => [ 'country' => 'US', 'province' => 'TX', 'time_zone' => 'America/Chicago' ], // S Texas 214 => [ 'country' => 'US', 'province' => 'TX', 'time_zone' => 'America/Chicago' ], // Texas: Dallas Metro (overlays 469/972) 945 => [ 'country' => 'US', 'province' => 'TX', 'time_zone' => 'America/Chicago' ], // Texas 254 => [ 'country' => 'US', 'province' => 'TX', 'time_zone' => 'America/Chicago' ], // Central Texas (Waco, Stephenville; split, see 817, 940) 281 => [ 'country' => 'US', 'province' => 'TX', 'time_zone' => 'America/Chicago' ], // Texas: Houston Metro (split 713; overlay 832) 325 => [ 'country' => 'US', 'province' => 'TX', 'time_zone' => 'America/Chicago' ], // Central Texas: Abilene, Sweetwater, Snyder, San Angelo (split from 915) 361 => [ 'country' => 'US', 'province' => 'TX', 'time_zone' => 'America/Chicago' ], // S Texas: Corpus Christi (split from 512; eff 2/13/99) 409 => [ 'country' => 'US', 'province' => 'TX', 'time_zone' => 'America/Chicago' ], // SE Texas: Galveston, Port Arthur, Beaumont (splits 936, 979) 430 => [ 'country' => 'US', 'province' => 'TX', 'time_zone' => 'America/Chicago' ], // NE Texas: Tyler (overlaid on 903, eff 7/20/02) 432 => [ 'country' => 'US', 'province' => 'TX', 'time_zone' => 'America/Denver' ], ///-6 W Texas: Big Spring, Midland, Odessa (split from 915, eff 4/5/03) 469 => [ 'country' => 'US', 'province' => 'TX', 'time_zone' => 'America/Chicago' ], // Texas: Dallas Metro (overlays 214/972) 512 => [ 'country' => 'US', 'province' => 'TX', 'time_zone' => 'America/Chicago' ], // S Texas: Austin (see split 361; overlay 737, perm 11/10/01) 682 => [ 'country' => 'US', 'province' => 'TX', 'time_zone' => 'America/Chicago' ], // Texas: Fort Worth areas (perm 10/7/00, mand 12/9/00) 713 => [ 'country' => 'US', 'province' => 'TX', 'time_zone' => 'America/Chicago' ], // Mid SE Texas: central Houston (split, 281; overlay 832) 737 => [ 'country' => 'US', 'province' => 'TX', 'time_zone' => 'America/Chicago' ], // S Texas: Austin (overlaid on 512, suspended; see also 361) 806 => [ 'country' => 'US', 'province' => 'TX', 'time_zone' => 'America/Chicago' ], // Panhandle Texas: Amarillo, Lubbock 817 => [ 'country' => 'US', 'province' => 'TX', 'time_zone' => 'America/Chicago' ], // N Cent. Texas: Fort Worth area (see 254, 940) 830 => [ 'country' => 'US', 'province' => 'TX', 'time_zone' => 'America/Chicago' ], // Texas: region surrounding San Antonio (split from 210) 832 => [ 'country' => 'US', 'province' => 'TX', 'time_zone' => 'America/Chicago' ], // Texas: Houston (overlay 713/281) 346 => [ 'country' => 'US', 'province' => 'TX', 'time_zone' => 'America/Chicago' ], // Texas: Houston 903 => [ 'country' => 'US', 'province' => 'TX', 'time_zone' => 'America/Chicago' ], // NE Texas: Tyler (see overlay 430, eff 7/20/02) 915 => [ 'country' => 'US', 'province' => 'TX', 'time_zone' => null ], ///-6 W Texas: El Paso (see splits 325 eff 4/5/03; 432, eff 4/5/03) (**NON-SPECIFIC: CST, MST) 936 => [ 'country' => 'US', 'province' => 'TX', 'time_zone' => 'America/Chicago' ], // SE Texas: Conroe, Lufkin, Nacogdoches, Crockett (split from 409, see also 979) 940 => [ 'country' => 'US', 'province' => 'TX', 'time_zone' => 'America/Chicago' ], // N Cent. Texas: Denton, Wichita Falls (split from 254, 817) 956 => [ 'country' => 'US', 'province' => 'TX', 'time_zone' => 'America/Chicago' ], // Texas: Valley of Texas area; Harlingen, Laredo (split from 210) 972 => [ 'country' => 'US', 'province' => 'TX', 'time_zone' => 'America/Chicago' ], // Texas: Dallas Metro (overlays 214/469) 979 => [ 'country' => 'US', 'province' => 'TX', 'time_zone' => 'America/Chicago' ], // SE Texas: Bryan, College Station, Bay City (split from 409, see also 936) 385 => [ 'country' => 'US', 'province' => 'UT', 'time_zone' => 'America/Denver' ], // Utah: Salt Lake City Metro (split from 801, eff 3/30/02 POSTPONED; see also 435) 435 => [ 'country' => 'US', 'province' => 'UT', 'time_zone' => 'America/Denver' ], // Rural Utah outside Salt Lake City metro (see split 801) 801 => [ 'country' => 'US', 'province' => 'UT', 'time_zone' => 'America/Denver' ], // Utah: Salt Lake City Metro (see split 385, eff 3/30/02; see also split 435) 276 => [ 'country' => 'US', 'province' => 'VA', 'time_zone' => 'America/New_York' ], // S and SW Virginia: Bristol, Stuart, Martinsville (split from 540; perm 9/1/01, mand 3/16/02) 434 => [ 'country' => 'US', 'province' => 'VA', 'time_zone' => 'America/New_York' ], // E Virginia: Charlottesville, Lynchburg, Danville, South Boston, and Emporia (split from 804, eff 6/1/01; see also 757) 540 => [ 'country' => 'US', 'province' => 'VA', 'time_zone' => 'America/New_York' ], // Western and Southwest Virginia: Shenandoah and Roanoke valleys: Fredericksburg, Harrisonburg, Roanoke, Salem, Lexington and nearby areas (see split 276; split from 703) 571 => [ 'country' => 'US', 'province' => 'VA', 'time_zone' => 'America/New_York' ], // Northern Virginia: Arlington, McLean, Tysons Corner (to be overlaid on 703 3/1/00; see earlier split 540) 703 => [ 'country' => 'US', 'province' => 'VA', 'time_zone' => 'America/New_York' ], // Northern Virginia: Arlington, McLean, Tysons Corner (see split 540; overlay 571) 757 => [ 'country' => 'US', 'province' => 'VA', 'time_zone' => 'America/New_York' ], // E Virginia: Tidewater / Hampton Roads area -- Norfolk, Virginia Beach, Chesapeake, Portsmouth, Hampton, Newport News, Suffolk (part of what used to be 804) 804 => [ 'country' => 'US', 'province' => 'VA', 'time_zone' => 'America/New_York' ], // E Virginia: Richmond (see splits 757, 434) 340 => [ 'country' => 'US', 'province' => 'VI', 'time_zone' => 'America/St_Thomas' ], //* US Virgin Islands (see also 809) 802 => [ 'country' => 'US', 'province' => 'VT', 'time_zone' => 'America/New_York' ], // Vermont 206 => [ 'country' => 'US', 'province' => 'WA', 'time_zone' => 'America/Los_Angeles' ], // W Washington state: Seattle and Bainbridge Island (see splits 253, 360, 425; overlay 564) 253 => [ 'country' => 'US', 'province' => 'WA', 'time_zone' => 'America/Los_Angeles' ], // Washington: South Tier - Tacoma, Federal Way (split from 206, see also 425; overlay 564) 360 => [ 'country' => 'US', 'province' => 'WA', 'time_zone' => 'America/Los_Angeles' ], // W Washington State: Olympia, Bellingham (area circling 206, 253, and 425; split from 206; see overlay 564) 425 => [ 'country' => 'US', 'province' => 'WA', 'time_zone' => 'America/Los_Angeles' ], // Washington: North Tier - Everett, Bellevue (split from 206, see also 253; overlay 564) 509 => [ 'country' => 'US', 'province' => 'WA', 'time_zone' => 'America/Los_Angeles' ], // E and Central Washington state: Spokane, Yakima, Walla Walla, Ellensburg 564 => [ 'country' => 'US', 'province' => 'WA', 'time_zone' => 'America/Los_Angeles' ], // W Washington State: Olympia, Bellingham (overlaid on 360; see also 206, 253, 425; assigned but not in use) 262 => [ 'country' => 'US', 'province' => 'WI', 'time_zone' => 'America/Chicago' ], // SE Wisconsin: counties of Kenosha, Ozaukee, Racine, Walworth, Washington, Waukesha (split from 414) 414 => [ 'country' => 'US', 'province' => 'WI', 'time_zone' => 'America/Chicago' ], // SE Wisconsin: Milwaukee County (see splits 920, 262) 608 => [ 'country' => 'US', 'province' => 'WI', 'time_zone' => 'America/Chicago' ], // SW Wisconsin: Madison 715 => [ 'country' => 'US', 'province' => 'WI', 'time_zone' => 'America/Chicago' ], // N Wisconsin: Eau Claire, Wausau, Superior 534 => [ 'country' => 'US', 'province' => 'WI', 'time_zone' => 'America/Chicago' ], // Wisconsin 920 => [ 'country' => 'US', 'province' => 'WI', 'time_zone' => 'America/Chicago' ], // NE Wisconsin: Appleton, Green Bay, Sheboygan, Fond du Lac (from Beaver Dam NE to Oshkosh, Appleton, and Door County; part of what used to be 414) 304 => [ 'country' => 'US', 'province' => 'WV', 'time_zone' => 'America/New_York' ], // West Virginia 681 => [ 'country' => 'US', 'province' => 'WV', 'time_zone' => 'America/New_York' ], // West Virginia 307 => [ 'country' => 'US', 'province' => 'WY', 'time_zone' => 'America/Denver' ], // Wyoming ]; break; case 'timesheet_view': $retval = [ 10 => TTi18n::gettext( 'Calendar' ), 20 => TTi18n::gettext( 'List' ), ]; break; case 'start_week_day': $retval = [ 0 => TTi18n::gettext( 'Sunday' ), 1 => TTi18n::gettext( 'Monday' ), 2 => TTi18n::gettext( 'Tuesday' ), 3 => TTi18n::gettext( 'Wednesday' ), 4 => TTi18n::gettext( 'Thursday' ), 5 => TTi18n::gettext( 'Friday' ), 6 => TTi18n::gettext( 'Saturday' ), ]; break; case 'schedule_icalendar_type': $retval = [ 0 => TTi18n::gettext( 'Disabled' ), 1 => TTi18n::gettext( 'Enabled (Authenticated)' ), 2 => TTi18n::gettext( 'Enabled (UnAuthenticated)' ), ]; break; case 'notification_status': $retval = [ //Kill switch to enable or disable sending notifications entirely. 0 => TTi18n::gettext( 'Disabled' ), 1 => TTi18n::gettext( 'Enabled' ), ]; break; case 'default_login_screen': $retval = [ 'Home' => TTi18n::gettext( 'Dashboard' ), 'TimeSheet' => TTi18n::gettext( 'TimeSheet' ), 'Schedule' => TTi18n::gettext( 'Schedule' ), ]; global $current_user; if ( isset( $current_user ) && is_object( $current_user ) ) { $permission = new Permission(); if ( $permission->Check( 'report', 'enabled', $current_user->getId(), $current_user->getCompany() ) ) { $retval['SavedReport'] = TTi18n::gettext( 'Saved Reports' ); } } break; case 'language': $retval = TTi18n::getLanguageArray(); //Because the array keys are strings, flex needs a sort prefix to maintain the order. if ( defined( 'TIMETREX_API' ) == true && TIMETREX_API == true ) { $retval = Misc::addSortPrefix( $retval ); } break; case 'columns': $retval = [ '-1000-first_name' => TTi18n::gettext( 'First Name' ), '-1002-last_name' => TTi18n::gettext( 'Last Name' ), '-1005-user_status' => TTi18n::gettext( 'Employee Status' ), '-1010-title' => TTi18n::gettext( 'Title' ), '-1020-user_group' => TTi18n::gettext( 'Group' ), '-1030-default_branch' => TTi18n::gettext( 'Default Branch' ), '-1040-default_department' => TTi18n::gettext( 'Default Department' ), '-1150-city' => TTi18n::gettext( 'City' ), '-1160-province' => TTi18n::gettext( 'Province/State' ), '-1170-country' => TTi18n::gettext( 'Country' ), '-1120-language_display' => TTi18n::gettext( 'Language' ), '-1130-date_format_display' => TTi18n::gettext( 'Date Format' ), '-1140-time_format_display' => TTi18n::gettext( 'Time Format' ), '-1150-time_zone_display' => TTi18n::gettext( 'TimeZone' ), '-1160-time_unit_format_display' => TTi18n::gettext( 'Time Unit Format' ), '-1170-distance_format_display' => TTi18n::gettext( 'Distance Units' ), '-1180-items_per_page' => TTi18n::gettext( 'Items Per Page' ), //'-1180-timesheet_view_display' => TTi18n::gettext('TimeSheet View'), '-1190-start_week_day_display' => TTi18n::gettext( 'Start Weekday' ), //'-1100-enable_email_notification_exception' => TTi18n::gettext('Email Notification Exception'), //'-1110-enable_email_notification_message' => TTi18n::gettext('Email Notification Message'), //'-1110-enable_email_notification_pay_stub' => TTi18n::gettext('Email Notification Pay Stub'), //'-1120-enable_email_notification_home' => TTi18n::gettext('Email Notification Home'), '-2000-created_by' => TTi18n::gettext( 'Created By' ), '-2010-created_date' => TTi18n::gettext( 'Created Date' ), '-2020-updated_by' => TTi18n::gettext( 'Updated By' ), '-2030-updated_date' => TTi18n::gettext( 'Updated Date' ), ]; break; case 'list_columns': $retval = Misc::arrayIntersectByKey( $this->getOptions( 'default_display_columns' ), Misc::trimSortPrefix( $this->getOptions( 'columns' ) ) ); break; case 'default_display_columns': //Columns that are displayed by default. $retval = [ 'first_name', 'last_name', 'date_format_display', 'time_format_display', 'time_unit_format_display', 'distance_format_display', 'time_zone_display', ]; break; } return $retval; } /** * @param $data * @return array */ function _getVariableToFunctionMap( $data ) { $variable_function_map = [ 'id' => 'ID', 'user_id' => 'User', 'first_name' => false, 'last_name' => false, 'user_name' => false, 'user_status_id' => false, 'user_status' => false, 'group_id' => false, 'user_group' => false, 'title_id' => false, 'title' => false, 'default_branch_id' => false, 'default_branch' => false, 'default_department_id' => false, 'default_department' => false, 'city' => false, 'province' => false, 'country' => false, 'language' => 'Language', 'date_format' => 'DateFormat', 'time_format' => 'TimeFormat', 'time_zone' => 'TimeZone', 'time_unit_format' => 'TimeUnitFormat', 'distance_format' => 'DistanceFormat', //Ignore when setting. 'language_display' => false, 'date_format_display' => false, 'time_format_display' => false, 'time_zone_display' => false, 'time_unit_format_display' => false, 'distance_format_display' => false, 'items_per_page' => 'ItemsPerPage', //'timesheet_view' => 'TimeSheetView', 'start_week_day' => 'StartWeekDay', 'start_week_day_display' => false, 'shortcut_key_sequence' => 'ShortcutKeySequence', 'enable_always_blank_timesheet_rows' => 'EnableAlwaysBlankTimeSheetRows', //'enable_auto_context_menu' => 'EnableAutoContextMenu', 'enable_report_open_new_window' => 'EnableReportOpenNewWindow', //'enable_email_notification_exception' => 'EnableEmailNotificationException', //'enable_email_notification_message' => 'EnableEmailNotificationMessage', //'enable_email_notification_pay_stub' => 'EnableEmailNotificationPayStub', //'enable_email_notification_home' => 'EnableEmailNotificationHome', //'schedule_icalendar_url' => 'ScheduleIcalendarURL', 'schedule_icalendar_type_id' => 'ScheduleIcalendarType', //'schedule_icalendar_event_name' => 'ScheduleIcalendarEventName', 'schedule_icalendar_alarm1_working' => 'ScheduleIcalendarAlarm1Working', 'schedule_icalendar_alarm2_working' => 'ScheduleIcalendarAlarm2Working', 'schedule_icalendar_alarm1_absence' => 'ScheduleIcalendarAlarm1Absence', 'schedule_icalendar_alarm2_absence' => 'ScheduleIcalendarAlarm2Absence', 'schedule_icalendar_alarm1_modified' => 'ScheduleIcalendarAlarm1Modified', 'schedule_icalendar_alarm2_modified' => 'ScheduleIcalendarAlarm2Modified', 'enable_save_timesheet_state' => 'EnableSaveTimesheetState', 'default_login_screen' => 'DefaultLoginScreen', 'notification_duration' => 'NotificationDuration', 'notification_status_id' => 'NotificationStatus', 'browser_permission_ask_date' => 'BrowserPermissionAskDate', 'deleted' => 'Deleted', ]; return $variable_function_map; } /** * @return bool */ function getUserObject() { return $this->getGenericObject( 'UserListFactory', $this->getUser(), 'user_obj' ); } /** * @return bool|mixed */ function getUser() { return $this->getGenericDataValue( 'user_id' ); } /** * @param string $value UUID * @return bool */ function setUser( $value ) { $value = TTUUID::castUUID( $value ); return $this->setGenericDataValue( 'user_id', $value ); } /** * @return bool|mixed */ function getLanguage() { return $this->getGenericDataValue( 'language' ); } /** * @param $value * @return bool */ function setLanguage( $value ) { $value = trim( $value ); return $this->setGenericDataValue( 'language', $value ); } /** * @return bool */ function getDateFormatExample() { return Option::getByKey( $this->getDateFormat(), Misc::trimSortPrefix( $this->getOptions( 'date_format_example' ) ) ); } /** * @return bool|string */ function getJSDateFormat() { $js_date_format = Option::getByKey( $this->getDateFormat(), $this->getOptions( 'js_date_format' ) ); if ( $js_date_format != '' ) { Debug::text( 'Javascript Date Format: ' . $js_date_format, __FILE__, __LINE__, __METHOD__, 10 ); return $js_date_format; } return '%d-%M-%y'; } /** * @return bool|mixed */ function getDateFormat() { return $this->getGenericDataValue( 'date_format' ); } /** * @param int $value EPOCH * @return bool */ function setDateFormat( $value ) { $value = trim( $value ); Debug::text( 'Date Format: ' . $value . ' Type: ' . gettype( $value ), __FILE__, __LINE__, __METHOD__, 10 ); return $this->setGenericDataValue( 'date_format', $value ); } /** * @return array|mixed */ function getTimeFormatExample() { return Misc::trimSortPrefix( Option::getByKey( $this->getTimeFormat(), $this->getOptions( 'time_format_example' ) ) ); } /** * @return bool|string */ function getJSTimeFormat() { $js_time_format = Option::getByKey( $this->getTimeFormat(), $this->getOptions( 'js_time_format' ) ); if ( $js_time_format != '' ) { Debug::text( 'Javascript Time Format: ' . $js_time_format, __FILE__, __LINE__, __METHOD__, 10 ); return $js_time_format; } return '%l:%M %p'; } /** * @return bool|mixed */ function getTimeFormat() { return $this->getGenericDataValue( 'time_format' ); } /** * @param $value * @return bool */ function setTimeFormat( $value ) { $value = trim( $value ); return $this->setGenericDataValue( 'time_format', $value ); } /** * @param $country * @param $province * @param bool $work_phone * @param bool $home_phone * @param bool $default * @return array|bool|mixed|string */ function getLocationTimeZone( $country, $province, $work_phone = false, $home_phone = false, $default = false, $enable_auto_detect = true ) { $country = strtoupper( $country ); $province = strtoupper( $province ); Debug::text( 'Country: ' . $country . ' Province: ' . $province . ' Work Phone: ' . $work_phone . ' Home Phone: ' . $home_phone . ' Default: ' . $default .' Enable AutoDetect: '. (int)$enable_auto_detect, __FILE__, __LINE__, __METHOD__, 9 ); if ( $enable_auto_detect == false && $default != '' ) { return $default; } $location_timezones = $this->getOptions( 'location_timezone' ); $area_code_timezone = $this->getOptions( 'area_code_timezone' ); //Work phone can be the most accurate. if ( $work_phone != '' ) { $work_area_code = $this->Validator->getPhoneNumberAreaCode( $work_phone ); //Make sure the area code matches the province, so if a BC province is specified with a ON area code, we use the province instead of area code. if ( $work_area_code !== false && isset( $area_code_timezone[$work_area_code] ) && $area_code_timezone[$work_area_code]['time_zone'] != null && $area_code_timezone[$work_area_code]['province'] == $province ) { Debug::text( 'Using Work Phone for timezone detection...', __FILE__, __LINE__, __METHOD__, 9 ); return $area_code_timezone[$work_area_code]['time_zone']; } } //Home phone is the next most accurate if ( $home_phone != '' ) { $home_area_code = $this->Validator->getPhoneNumberAreaCode( $home_phone ); //Make sure the area code matches the province, so if a BC province is specified with a ON area code, we use the province instead of area code. if ( $home_area_code !== false && isset( $area_code_timezone[$home_area_code] ) && $area_code_timezone[$home_area_code]['time_zone'] != null && $area_code_timezone[$home_area_code]['province'] == $province ) { Debug::text( 'Using Home Phone for timezone detection...', __FILE__, __LINE__, __METHOD__, 9 ); return $area_code_timezone[$home_area_code]['time_zone']; } } //Country/province is the last option. if ( $country != '' && isset( $location_timezones[$country] ) ) { if ( $province != '' && is_array( $location_timezones[$country] ) && isset( $location_timezones[$country][$province] ) && $location_timezones[$country][$province] != null ) { Debug::text( 'Using Country/Province for timezone detection...', __FILE__, __LINE__, __METHOD__, 9 ); if ( is_array( $location_timezones[$country][$province] ) && $default == '' ) { //No default specified, so lets guess and use the first item from the array, assuming its the most commonly used. return Misc::trimSortPrefix( $location_timezones[$country][$province][0] ); } else if ( !is_array( $location_timezones[$country][$province] ) ) { return Misc::trimSortPrefix( $location_timezones[$country][$province] ); } } else if ( isset( $location_timezones[$country] ) && !is_array( $location_timezones[$country] ) && $location_timezones[$country] != null ) { Debug::text( 'Using Country for timezone detection...', __FILE__, __LINE__, __METHOD__, 9 ); if ( is_array( $location_timezones[$country] ) && $default == '' ) { //No default specified, so lets guess and use the first item from the array, assuming its the most commonly used. return Misc::trimSortPrefix( $location_timezones[$country][0] ); } else if ( !is_array( $location_timezones[$country] ) ) { return Misc::trimSortPrefix( $location_timezones[$country] ); } } } if ( $default != '' ) { Debug::text( 'Using Default for timezone detection...', __FILE__, __LINE__, __METHOD__, 9 ); return $default; } Debug::text( 'Using GMT timezone detection...', __FILE__, __LINE__, __METHOD__, 9 ); return 'GMT'; } /** * @return bool|mixed */ function getTimeZone() { return $this->getGenericDataValue( 'time_zone' ); } /** * @param $value * @return bool */ function setTimeZone( $value ) { $value = Misc::trimSortPrefix( trim( $value ) ); return $this->setGenericDataValue( 'time_zone', $value ); } /** * @return mixed */ function getTimeUnitFormatExample() { $options = $this->getOptions( 'time_unit_format' ); return $options[$this->getTimeUnitFormat()]; } /** * @return bool|mixed */ function getTimeUnitFormat() { return $this->getGenericDataValue( 'time_unit_format' ); } /** * @param $value * @return bool */ function setTimeUnitFormat( $value ) { $value = trim( $value ); return $this->setGenericDataValue( 'time_unit_format', $value ); } /** * @param $meters * @param null $format * @return bool|float|int */ function convertMetersToDistance( $meters, $format = null ) { if ( $format == '' ) { $format = self::getDistanceFormat(); } switch ( $format ) { case 20: //Miles $dst_unit = 'mi'; break; case 30: //Meters $dst_unit = 'm'; break; case 10: //KM default: $dst_unit = 'km'; break; } return UnitConvert::convert( 'm', $dst_unit, $meters ); } /** * @return bool|mixed */ function getDistanceFormat() { return $this->getGenericDataValue( 'distance_format' ); } /** * @param $value * @return bool */ function setDistanceFormat( $value ) { $value = trim( $value ); return $this->setGenericDataValue( 'distance_format', $value ); } /** * @return bool|mixed */ function getItemsPerPage() { return $this->getGenericDataValue( 'items_per_page' ); } /** * @param $value * @return bool */ function setItemsPerPage( $value ) { $value = (int)$value; return $this->setGenericDataValue( 'items_per_page', $value ); } /** * @return bool|mixed */ function getNotificationDuration() { return $this->getGenericDataValue( 'notification_duration' ); } /** * @param $value * @return bool */ function setNotificationDuration( $value ) { $value = (int)$value; return $this->setGenericDataValue( 'notification_duration', $value ); } /** * A quick function to change just the timezone, without having to change * date formats and such in the process. * @return bool */ function setTimeZonePreferences() { return TTDate::setTimeZone( $this->getTimeZone() ); } /** * @return bool */ function setDateTimePreferences() { //TTDate::setTimeZone( $this->getTimeZone() ); if ( $this->setTimeZonePreferences() == false ) { //In case setting the time zone failed return false; } TTDate::setDateFormat( $this->getDateFormat() ); TTDate::setTimeFormat( $this->getTimeFormat() ); TTDate::setTimeUnitFormat( $this->getTimeUnitFormat() ); return true; } /** * @return bool|mixed */ function getTimeSheetView() { return $this->getGenericDataValue( 'timesheet_view' ); } /** * @param $value * @return bool */ function setTimeSheetView( $value ) { $value = trim( $value ); return $this->setGenericDataValue( 'timesheet_view', $value ); } /** * @return bool|mixed */ function getStartWeekDay() { return $this->getGenericDataValue( 'start_week_day' ); } /** * @param $value * @return bool */ function setStartWeekDay( $value ) { $value = trim( $value ); return $this->setGenericDataValue( 'start_week_day', $value ); } /** * Used in Flex interface only, currently its hardcoded for now at least. Default: CTRL+ALT * @return bool|mixed */ function getShortcutKeySequence() { return $this->getGenericDataValue( 'shortcut_key_sequence' ); } /** * @param $value * @return bool */ function setShortcutKeySequence( $value ) { $value = trim( $value ); return $this->setGenericDataValue( 'shortcut_key_sequence', $value ); } /** * @return bool */ function getEnableAlwaysBlankTimeSheetRows() { return $this->fromBool( $this->getGenericDataValue( 'enable_always_blank_timesheet_rows' ) ); } /** * @param $value * @return bool */ function setEnableAlwaysBlankTimeSheetRows( $value ) { return $this->setGenericDataValue( 'enable_always_blank_timesheet_rows', $this->toBool( $value ) ); } /** * @return bool */ function getEnableAutoContextMenu() { return $this->fromBool( $this->getGenericDataValue( 'enable_auto_context_menu' ) ); } /** * @param $value * @return bool */ function setEnableAutoContextMenu( $value ) { return $this->setGenericDataValue( 'enable_auto_context_menu', $this->toBool( $value ) ); } /** * @return bool */ function getEnableReportOpenNewWindow() { return $this->fromBool( $this->getGenericDataValue( 'enable_report_open_new_window' ) ); } /** * @param $value * @return bool */ function setEnableReportOpenNewWindow( $value ) { return $this->setGenericDataValue( 'enable_report_open_new_window', $this->toBool( $value ) ); } /** * @return bool */ function getEnableEmailNotificationException() { return $this->fromBool( $this->getGenericDataValue( 'enable_email_notification_exception' ) ); } /** * @param $value * @return bool */ function setEnableEmailNotificationException( $value ) { return $this->setGenericDataValue( 'enable_email_notification_exception', $this->toBool( $value ) ); } /** * @return bool */ function getEnableEmailNotificationMessage() { return $this->fromBool( $this->getGenericDataValue( 'enable_email_notification_message' ) ); } /** * @param $value * @return bool */ function setEnableEmailNotificationMessage( $value ) { return $this->setGenericDataValue( 'enable_email_notification_message', $this->toBool( $value ) ); } /** * @return bool */ function getEnableEmailNotificationPayStub() { return $this->fromBool( $this->getGenericDataValue( 'enable_email_notification_pay_stub' ) ); } /** * @param $value * @return bool */ function setEnableEmailNotificationPayStub( $value ) { return $this->setGenericDataValue( 'enable_email_notification_pay_stub', $this->toBool( $value ) ); } /** * @return bool */ function getEnableEmailNotificationHome() { return $this->fromBool( $this->getGenericDataValue( 'enable_email_notification_home' ) ); } /** * @param $value * @return bool */ function setEnableEmailNotificationHome( $value ) { return $this->setGenericDataValue( 'enable_email_notification_home', $this->toBool( $value ) ); } /** * @return bool|int */ function getScheduleIcalendarType() { return $this->getGenericDataValue( 'schedule_icalendar_type_id' ); } /** * @param $value * @return bool */ function setScheduleIcalendarType( $value ) { $value = (int)trim( $value ); return $this->setGenericDataValue( 'schedule_icalendar_type_id', $value ); } /** * Helper functions for dealing with unauthenticated calendar access, required by Google Calendar for now. * @param null $user_name * @param int $type_id ID * @param null $selected_schedule * @return string */ function getScheduleIcalendarURL( $user_name = null, $type_id = null, $selected_schedule = null ) { if ( $user_name == '' ) { $user_name = $this->getUserObject()->getUserName(); } if ( $type_id == '' ) { $type_id = $this->getScheduleIcalendarType(); } $url_fragments = []; if ( $type_id == 2 ) { $url_fragments[] = 'u=' . $user_name; $url_fragments[] = 'k=' . $this->getScheduleIcalendarKey(); } if ( $selected_schedule != '' ) { $url_fragments[] = 's=' . $selected_schedule; } $retval = Environment::getBaseURL() . 'ical/ical.php'; if ( count( $url_fragments ) > 0 ) { $retval .= '?' . implode( '&', $url_fragments ); } return $retval; } /** * @param $key * @return bool */ function checkScheduleICalendarKey( $key ) { Debug::text( 'Checking Key: ' . $key . ' Should Match: ' . $this->getScheduleIcalendarKey(), __FILE__, __LINE__, __METHOD__, 10 ); if ( trim( $key ) == $this->getScheduleIcalendarKey( TTPassword::getPasswordVersion( $key ) ) ) { return true; } return false; } /** * @param null $version * @return bool|string */ function getScheduleIcalendarKey( $version = null ) { if ( (int)$version == 1 ) { $salt = TTPassword::getPasswordSalt(); $user_id = TTUUID::convertUUIDToInt( $this->getUserObject()->getID() ); $retval = substr( md5( $this->getScheduleIcalendarEventName() . $salt . $user_id ), 0, 12 ); } else { //Should be v3. $user_name = TTUUID::castUUID( $this->getUserObject()->getUserName() ); $user_id = TTUUID::castUUID( $this->getUserObject()->getID() ); //Use the TTPassword class to better handle different versions of the hashed data. $retval = strtoupper( substr( TTPassword::encryptPassword( $user_name, $user_id, $this->getScheduleIcalendarEventName(), $version ), 0, 12 ) ); } Debug::text( 'Key: ' . $retval, __FILE__, __LINE__, __METHOD__, 10 ); return $retval; } /** * Currently used as part of the unauthenticated key, so if this changes the key to access the calendar changes too. * @return bool */ function getScheduleIcalendarEventName() { return $this->fromBool( $this->getGenericDataValue( 'schedule_icalendar_event_name' ) ); } /** * @param $value * @return bool */ function setScheduleIcalendarEventName( $value ) { return $this->setGenericDataValue( 'schedule_icalendar_event_name', $this->toBool( $value ) ); } /** * @return bool|int */ function getScheduleIcalendarAlarm1Working() { return (int)$this->getGenericDataValue( 'schedule_icalendar_alarm1_working' ); } /** * @param $value * @return bool */ function setScheduleIcalendarAlarm1Working( $value ) { $value = (int)trim( $value ); return $this->setGenericDataValue( 'schedule_icalendar_alarm1_working', $value ); } /** * @return bool|int */ function getScheduleIcalendarAlarm2Working() { return (int)$this->getGenericDataValue( 'schedule_icalendar_alarm2_working' ); } /** * @param $value * @return bool */ function setScheduleIcalendarAlarm2Working( $value ) { $value = (int)trim( $value ); return $this->setGenericDataValue( 'schedule_icalendar_alarm2_working', $value ); } /** * @return bool|int */ function getScheduleIcalendarAlarm1Absence() { return (int)$this->getGenericDataValue( 'schedule_icalendar_alarm1_absence' ); } /** * @param $value * @return bool */ function setScheduleIcalendarAlarm1Absence( $value ) { $value = (int)trim( $value ); return $this->setGenericDataValue( 'schedule_icalendar_alarm1_absence', $value ); } /** * @return bool|int */ function getScheduleIcalendarAlarm2Absence() { return (int)$this->getGenericDataValue( 'schedule_icalendar_alarm2_absence' ); } /** * @param $value * @return bool */ function setScheduleIcalendarAlarm2Absence( $value ) { $value = (int)trim( $value ); return $this->setGenericDataValue( 'schedule_icalendar_alarm2_absence', $value ); } /** * @return bool|int */ function getScheduleIcalendarAlarm1Modified() { return (int)$this->getGenericDataValue( 'schedule_icalendar_alarm1_modified' ); } /** * @param $value * @return bool */ function setScheduleIcalendarAlarm1Modified( $value ) { $value = (int)trim( $value ); return $this->setGenericDataValue( 'schedule_icalendar_alarm1_modified', $value ); } /** * @return bool|int */ function getScheduleIcalendarAlarm2Modified() { return (int)$this->getGenericDataValue( 'schedule_icalendar_alarm2_modified' ); } /** * @param $value * @return bool */ function setScheduleIcalendarAlarm2Modified( $value ) { $value = (int)trim( $value ); return $this->setGenericDataValue( 'schedule_icalendar_alarm2_modified', $value ); } /** * @return bool */ function getEnableSaveTimesheetState() { return $this->fromBool( $this->getGenericDataValue( 'enable_save_timesheet_state' ) ); } /** * @param $value * @return bool */ function setEnableSaveTimesheetState( $value ) { return $this->setGenericDataValue( 'enable_save_timesheet_state', $this->toBool( $value ) ); } /** * @return int */ function getNotificationStatus() { return $this->getGenericDataValue( 'notification_status_id' ); //Don't cast to INT as we need to check for false or 0. } /** * @param $value * @return bool */ function setNotificationStatus( $value ) { $value = (int)trim( $value ); return $this->setGenericDataValue('notification_status_id', $value ); } /** * @return int */ function getBrowserPermissionAskDate( $raw = false ) { $value = $this->getGenericDataValue( 'browser_permission_ask_date' ); if ( $value !== false ) { if ( $raw === true ) { return $value; } else { return TTDate::strtotime( $value ); } } return false; } /** * @param $epoch * @return bool */ function setBrowserPermissionAskDate( $epoch ) { $value = (int)$epoch; return $this->setGenericDataValue('browser_permission_ask_date', $value ); } /** * Default: Home/Dashboard * @return bool|mixed */ function getDefaultLoginScreen() { return $this->getGenericDataValue( 'default_login_screen' ); } /** * @param $value * @return bool */ function setDefaultLoginScreen( $value ) { $value = trim( $value ); return $this->setGenericDataValue( 'default_login_screen', $value ); } /** * @param bool $ignore_warning * @return bool */ function Validate( $ignore_warning = true ) { // // BELOW: Validation code moved from set*() functions. // // User if ( $this->getUser() != TTUUID::getZeroID() ) { $ulf = TTnew( 'UserListFactory' ); /** @var UserListFactory $ulf */ $this->Validator->isResultSetWithRows( 'user', $ulf->getByID( $this->getUser() ), TTi18n::gettext( 'Invalid Employee' ) ); } // Language $language_options = TTi18n::getLanguageArray(); $this->Validator->inArrayKey( 'language', $this->getLanguage(), TTi18n::gettext( 'Incorrect language' ), $language_options ); // Date format if ( $this->getDateFormat() != '' ) { $this->Validator->inArrayKey( 'date_format', $this->getDateFormat(), TTi18n::gettext( 'Incorrect date format' ), Misc::trimSortPrefix( $this->getOptions( 'date_format' ) ) ); } // Time format $this->Validator->inArrayKey( 'time_format', $this->getTimeFormat(), TTi18n::gettext( 'Incorrect time format' ), $this->getOptions( 'time_format' ) ); // Time zone $this->Validator->inArrayKey( 'time_zone', $this->getTimeZone(), TTi18n::gettext( 'Incorrect time zone' ), Misc::trimSortPrefix( $this->getOptions( 'time_zone' ) ) ); // Time units $this->Validator->inArrayKey( 'time_unit_format', $this->getTimeUnitFormat(), TTi18n::gettext( 'Incorrect time units' ), $this->getOptions( 'time_unit_format' ) ); // Distance units $this->Validator->inArrayKey( 'distance_format', $this->getDistanceFormat(), TTi18n::gettext( 'Incorrect distance units' ), $this->getOptions( 'distance_format' ) ); // Items per page $items_per_page_min = ( PRODUCTION == false ) ? 1 : 5; //Allow lower numbers to help with testing. $items_per_page_max = ( PRODUCTION == false ) ? 10000 : 2000; //Allow higher numbers to help with testing. if ( $this->getItemsPerPage() == '' || $this->getItemsPerPage() < $items_per_page_min || $this->getItemsPerPage() > $items_per_page_max ) { $this->Validator->isTrue( 'items_per_page', false, TTi18n::gettext( 'Rows per page must be between %1 and %2', [ $items_per_page_min, $items_per_page_max ] ) ); } // Default TimeSheet view' if ( $this->getTimeSheetView() !== false ) { $this->Validator->inArrayKey( 'timesheet_view', $this->getTimeSheetView(), TTi18n::gettext( 'Incorrect default TimeSheet view' ), $this->getOptions( 'timesheet_view' ) ); } // Day to start a week on $this->Validator->inArrayKey( 'start_week_day', $this->getStartWeekDay(), TTi18n::gettext( 'Incorrect day to start a week on' ), $this->getOptions( 'start_week_day' ) ); // Shortcut key sequence if ( $this->getShortcutKeySequence() != '' ) { $this->Validator->isLength( 'shortcut_key_sequence', $this->getShortcutKeySequence(), TTi18n::gettext( 'Shortcut key sequence is too short or too long' ), 0, 250 ); } // Option to enable calendar synchronization $this->Validator->inArrayKey( 'schedule_icalendar_type_id', $this->getScheduleIcalendarType(), TTi18n::gettext( 'Incorrect option to enable calendar synchronization' ), $this->getOptions( 'schedule_icalendar_type' ) ); // Time for alarm #1 $this->Validator->isNumeric( 'schedule_icalendar_alarm1_working', $this->getScheduleIcalendarAlarm1Working(), TTi18n::gettext( 'Invalid time for alarm #1' ) ); // Time for alarm #2 $this->Validator->isNumeric( 'schedule_icalendar_alarm2_working', $this->getScheduleIcalendarAlarm2Working(), TTi18n::gettext( 'Invalid time for alarm #2' ) ); // Time for alarm #1 $this->Validator->isNumeric( 'schedule_icalendar_alarm1_absence', $this->getScheduleIcalendarAlarm1Absence(), TTi18n::gettext( 'Invalid time for alarm #1' ) ); // Time for alarm #2 $this->Validator->isNumeric( 'schedule_icalendar_alarm2_absence', $this->getScheduleIcalendarAlarm2Absence(), TTi18n::gettext( 'Invalid time for alarm #2' ) ); // Time for alarm #1 $this->Validator->isNumeric( 'schedule_icalendar_alarm1_modified', $this->getScheduleIcalendarAlarm1Modified(), TTi18n::gettext( 'Invalid time for alarm #1' ) ); // Time for alarm #2 $this->Validator->isNumeric( 'schedule_icalendar_alarm2_modified', $this->getScheduleIcalendarAlarm2Modified(), TTi18n::gettext( 'Invalid time for alarm #2' ) ); // Default login screen if ( $this->getDefaultLoginScreen() != '' ) { $this->Validator->isLength( 'default_login_screen', $this->getDefaultLoginScreen(), TTi18n::gettext( 'Default login screen is too short or too long' ), 0, 250 ); } // // ABOVE: Validation code moved from set*() functions. // if ( $this->getUser() == '' ) { $this->Validator->isTRUE( 'user', false, TTi18n::gettext( 'Invalid Employee' ) ); } if ( $this->getDateFormat() == '' ) { $this->Validator->isTRUE( 'date_format', false, TTi18n::gettext( 'Incorrect date format' ) ); } // Duration of notification popup in web browser. if ( $this->getNotificationDuration() < 0 || $this->getNotificationDuration() > 86400 ) { $this->Validator->isTrue( 'notification_duration', false, TTi18n::gettext( 'Notification duration must be between 0 and 86400 seconds' ) ); } // status of push notificstion settings $this->Validator->inArrayKey( 'notification_status_id', $this->getNotificationStatus(), TTi18n::gettext( 'Incorrect Notification Status' ), $this->getOptions( 'notification_status' ) ); return true; } /** * @return bool */ function isPreferencesComplete() { if ( $this->getItemsPerPage() == '' || $this->getTimeZone() == '' ) { Debug::text( 'User Preferences is NOT Complete: ', __FILE__, __LINE__, __METHOD__, 10 ); return false; } Debug::text( 'User Preferences IS Complete: ', __FILE__, __LINE__, __METHOD__, 10 ); return true; } /** * @return bool */ function preValidate() { global $config_vars; if ( isset( $config_vars['other']['installer_enabled'] ) && $config_vars['other']['installer_enabled'] != 1 ) { //These cause SQL errors when upgrading from older schema versions (1113A), so skip them for now. if ( $this->getNotificationStatus() === false || $this->getNotificationStatus() === '' ) { $this->setNotificationStatus( 1 ); //1=Enabled } if ( $this->getNotificationDuration() === false || $this->getNotificationStatus() === '' ) { $this->setNotificationDuration( 120 ); } } //Check the locale, if its not english, we need to make sure the selected date format is correct for the language, or else force it. if ( $this->getLanguage() != 'en' ) { if ( Option::getByValue( $this->getDateFormat(), $this->getOptions( 'other_date_format' ) ) == false ) { //Force a change of date format $this->setDateFormat( 'd/m/Y' ); Debug::text( 'Language changed and date format doesnt match any longer, forcing it to: d/m/Y', __FILE__, __LINE__, __METHOD__, 10 ); } else { Debug::text( 'Date format doesnt need fixing...', __FILE__, __LINE__, __METHOD__, 10 ); } } return true; } /** * @return bool */ function postSave() { $this->removeCache( $this->getUser() ); if ( is_object( $this->getUserObject() ) ) { //CompanyFactory->getEncoding() is used to determine report encodings based on data saved here. $this->removeCache( 'encoding_' . $this->getUserObject()->getCompany(), 'company' ); } return true; } /** * Support setting created_by, updated_by especially for importing data. * Make sure data is set based on the getVariableToFunctionMap order. * @param $data * @return bool */ function setObjectFromArray( $data ) { if ( is_array( $data ) ) { $variable_function_map = $this->getVariableToFunctionMap(); foreach ( $variable_function_map as $key => $function ) { if ( isset( $data[$key] ) ) { $function = 'set' . $function; switch ( $key ) { default: if ( method_exists( $this, $function ) ) { $this->$function( $data[$key] ); } break; } } } $this->setCreatedAndUpdatedColumns( $data ); return true; } return false; } /** * @param null $include_columns * @param bool $permission_children_ids * @return array */ function getObjectAsArray( $include_columns = null, $permission_children_ids = false ) { $uf = TTnew( 'UserFactory' ); /** @var UserFactory $uf */ $data = []; $variable_function_map = $this->getVariableToFunctionMap(); if ( is_array( $variable_function_map ) ) { foreach ( $variable_function_map as $variable => $function_stub ) { if ( $include_columns == null || ( isset( $include_columns[$variable] ) && $include_columns[$variable] == true ) ) { $function = 'get' . $function_stub; switch ( $variable ) { case 'first_name': case 'last_name': case 'user_name': case 'user_status_id': case 'group_id': case 'user_group': case 'title_id': case 'title': case 'default_branch_id': case 'default_branch': case 'default_department_id': case 'default_department': case 'city': case 'province': case 'country': $data[$variable] = $this->getColumn( $variable ); break; case 'user_status': $data[$variable] = Option::getByKey( (int)$this->getColumn( 'user_status_id' ), $uf->getOptions( 'status' ) ); break; //Add the *_display element for each of the below fields. case 'language_display': case 'time_zone_display': case 'time_unit_format_display': case 'distance_format_display': case 'timesheet_view_display': case 'start_week_day_display': switch ( $variable ) { case 'language_display': $function = 'getLanguage'; break; //Use Date/Time format example functions below instead. //case 'date_format_display': // $function = 'getDateFormat'; // break; //case 'time_format_display': // $function = 'getTimeFormat'; // break; case 'time_zone_display': $function = 'getTimeZone'; break; case 'time_unit_format_display': $function = 'getTimeUnitFormat'; break; case 'distance_format_display': $function = 'getDistanceFormat'; break; case 'timesheet_view_display': $function = 'getTimeSheetView'; break; case 'start_week_day_display': $function = 'getStartWeekDay'; break; } $variable = str_replace( '_display', '', $variable ); if ( method_exists( $this, $function ) ) { $data[$variable . '_display'] = Option::getByKey( $this->$function(), Misc::trimSortPrefix( $this->getOptions( $variable ) ) ); } break; case 'date_format_display': $data[$variable] = $this->getDateFormatExample(); break; case 'time_format_display': $data[$variable] = $this->getTimeFormatExample(); break; default: if ( method_exists( $this, $function ) ) { $data[$variable] = $this->$function(); } break; } } } $this->getPermissionColumns( $data, $this->getUser(), $this->getCreatedBy(), $permission_children_ids, $include_columns ); $this->getCreatedAndUpdatedColumns( $data, $include_columns ); } return $data; } /** * @param $log_action * @return bool */ function addLog( $log_action ) { $u_obj = $this->getUserObject(); if ( is_object( $u_obj ) ) { return TTLog::addEntry( $this->getId(), $log_action, TTi18n::getText( 'Employee Preferences' ) . ': ' . $u_obj->getFullName( false, true ), null, $this->getTable(), $this ); } return false; } } ?>