<?php
/*
 * @brief Получение страны, региона и города.
 *
 * Функция сначала использует класс IPGeoBase. Если IP не удалось найти в IPGeoBase, используется MaxMind GeoLite.
 * Для России и Украины названия города и региона возвращаются на русском языке.
 *
 * @param ip IP-адрес
 * @return в случае успеха массив array('country' => , 'region' => , 'city' => ), иначе - false
 */
function getGeoLocation($ip)
{
    global $arGeoCodes;

    //GeoIP
    require_once(dirname(__FILE__) . "/geoip/geoip.inc");
    require_once(dirname(__FILE__) . "/geoip/geoipcity.inc"); //GeoLite City
    require_once(dirname(__FILE__) . "/geoip/geoipregionvars.php");
    require_once(dirname(__FILE__) . "/geoipregionvars.ru.php"); //перезаписываем русскими названиями RU и UA

    //IpGeoBase
    require_once(dirname(__FILE__) . "/ipgeobase.php");

    $gi = geoip_open(dirname(__FILE__) . "/GeoLiteCity.dat", GEOIP_STANDARD);

    $gb = new IPGeoBase();

    $country = $region = $city = '';
    $data = $gb->getRecord($ip);
    if($data)
    {
        /*foreach($data as &$v)
        {
            $v = iconv('windows-1251', 'utf-8', $v);
        }
        unset($v);*/
        $country = !empty($data['cc']) ? $arGeoCodes[$data['cc']] : '';
        $region = !empty($data['region']) ? $data['region'] : '';
        $city = !empty($data['city']) ? $data['city'] : '';
    }

    if(!in_array($data['cc'], array('RU', 'UA')))
    {
        $record = geoip_record_by_addr($gi, $ip);

        if($record)
        {
            $country = !empty($record->country_code) ? $arGeoCodes[$record->country_code] : '';
            $region = isset($GEOIP_REGION_NAME[$record->country_code][$record->region]) ? $GEOIP_REGION_NAME[$record->country_code][$record->region] : $record->region;
            $city = $record->city;
            geoip_close($gi);
        }
    }

    if($country)
    {
        return array('country' => $country, 'region' => $region, 'city' => $city);
    }
    else
    {
        return false;
    }

}

$arGeoCodes = array(
    'AU' => 'Австралия',
    'AT' => 'Австрия',
    'AZ' => 'Азербайджан',
    'AX' => 'Аландские острова',
    'AL' => 'Албания',
    'DZ' => 'Алжир',
    'VI' => 'Американские Виргинские острова',
    'AS' => 'Американское Самоа',
    'AI' => 'Ангилья',
    'AO' => 'Ангола',
    'AD' => 'Андорра',
    'AQ' => 'Антарктида',
    'AG' => 'Антигуа и Барбуда',
    'AR' => 'Аргентина',
    'AM' => 'Армения',
    'AW' => 'Аруба',
    'AF' => 'Афганистан',
    'BS' => 'Багамы',
    'BD' => 'Бангладеш',
    'BB' => 'Барбадос',
    'BH' => 'Бахрейн',
    'BZ' => 'Белиз',
    'BY' => 'Белоруссия',
    'BE' => 'Бельгия',
    'BJ' => 'Бенин',
    'BM' => 'Бермуды',
    'BG' => 'Болгария',
    'BO' => 'Боливия',
    'BQ' => 'Бонэйр, Синт-Эстатиус и Саба',
    'BA' => 'Босния и Герцеговина',
    'BW' => 'Ботсвана',
    'BR' => 'Бразилия',
    'IO' => 'Британская территория в Индийском океане',
    'VG' => 'Британские Виргинские острова',
    'BN' => 'Бруней',
    'BF' => 'Буркина-Фасо',
    'BI' => 'Бурунди',
    'BT' => 'Бутан',
    'VU' => 'Вануату',
    'VA' => 'Ватикан',
    'GB' => 'Великобритания',
    'HU' => 'Венгрия',
    'VE' => 'Венесуэла',
    'UM' => 'Внешние малые острова (США)',
    'TL' => 'Восточный Тимор',
    'VN' => 'Вьетнам',
    'GA' => 'Габон',
    'HT' => 'Гаити',
    'GY' => 'Гайана',
    'GM' => 'Гамбия',
    'GH' => 'Гана',
    'GP' => 'Гваделупа',
    'GT' => 'Гватемала',
    'GF' => 'Гвиана',
    'GN' => 'Гвинея',
    'GW' => 'Гвинея-Бисау',
    'DE' => 'Германия',
    'GG' => 'Гернси',
    'GI' => 'Гибралтар',
    'HN' => 'Гондурас',
    'HK' => 'Гонконг',
    'GD' => 'Гренада',
    'GL' => 'Гренландия',
    'GR' => 'Греция',
    'GE' => 'Грузия',
    'GU' => 'Гуам',
    'DK' => 'Дания',
    'JE' => 'Джерси',
    'DJ' => 'Джибути',
    'DM' => 'Доминика',
    'DO' => 'Доминиканская Республика',
    'CD' => 'ДР Конго',
    'EU' => 'Европейский союз',
    'EG' => 'Египет',
    'ZM' => 'Замбия',
    'EH' => 'Западная Сахара',
    'ZW' => 'Зимбабве',
    'IL' => 'Израиль',
    'IN' => 'Индия',
    'ID' => 'Индонезия',
    'JO' => 'Иордания',
    'IQ' => 'Ирак',
    'IR' => 'Иран',
    'IE' => 'Ирландия',
    'IS' => 'Исландия',
    'ES' => 'Испания',
    'IT' => 'Италия',
    'YE' => 'Йемен',
    'CV' => 'Кабо-Верде',
    'KZ' => 'Казахстан',
    'KY' => 'Каймановы острова',
    'KH' => 'Камбоджа',
    'CM' => 'Камерун',
    'CA' => 'Канада',
    'QA' => 'Катар',
    'KE' => 'Кения',
    'CY' => 'Кипр',
    'KG' => 'Киргизия',
    'KI' => 'Кирибати',
    'TW' => 'Китайская Республика',
    'KP' => 'КНДР',
    'CN' => 'КНР',
    'CC' => 'Кокосовые острова',
    'CO' => 'Колумбия',
    'KM' => 'Коморы',
    'CR' => 'Коста-Рика',
    'CI' => 'Кот-д’Ивуар',
    'CU' => 'Куба',
    'KW' => 'Кувейт',
    'CW' => 'Кюрасао',
    'LA' => 'Лаос',
    'LV' => 'Латвия',
    'LS' => 'Лесото',
    'LR' => 'Либерия',
    'LB' => 'Ливан',
    'LY' => 'Ливия',
    'LT' => 'Литва',
    'LI' => 'Лихтенштейн',
    'LU' => 'Люксембург',
    'MU' => 'Маврикий',
    'MR' => 'Мавритания',
    'MG' => 'Мадагаскар',
    'YT' => 'Майотта',
    'MO' => 'Макао',
    'MK' => 'Македония',
    'MW' => 'Малави',
    'MY' => 'Малайзия',
    'ML' => 'Мали',
    'MV' => 'Мальдивы',
    'MT' => 'Мальта',
    'MA' => 'Марокко',
    'MQ' => 'Мартиника',
    'MH' => 'Маршалловы Острова',
    'MX' => 'Мексика',
    'FM' => 'Микронезия',
    'MZ' => 'Мозамбик',
    'MD' => 'Молдавия',
    'MC' => 'Монако',
    'MN' => 'Монголия',
    'MS' => 'Монтсеррат',
    'MM' => 'Мьянма',
    'NA' => 'Намибия',
    'NR' => 'Науру',
    'NP' => 'Непал',
    'NE' => 'Нигер',
    'NG' => 'Нигерия',
    'NL' => 'Нидерланды',
    'NI' => 'Никарагуа',
    'NU' => 'Ниуэ',
    'NZ' => 'Новая Зеландия',
    'NC' => 'Новая Каледония',
    'NO' => 'Норвегия',
    'AE' => 'ОАЭ',
    'OM' => 'Оман',
    'BV' => 'Остров Буве',
    'IM' => 'Остров Мэн',
    'CK' => 'Острова Кука',
    'NF' => 'Остров Норфолк',
    'CX' => 'Остров Рождества',
    'PN' => 'Острова Питкэрн',
    'SH' => 'Острова Святой Елены, Вознесения и Тристан-да-Кунья',
    'PK' => 'Пакистан',
    'PW' => 'Палау',
    'PS' => 'Палестинская национальная администрация',
    'PA' => 'Панама',
    'PG' => 'Папуа — Новая Гвинея',
    'PY' => 'Парагвай',
    'PE' => 'Перу',
    'PL' => 'Польша',
    'PT' => 'Португалия',
    'PR' => 'Пуэрто-Рико',
    'CG' => 'Республика Конго',
    'KR' => 'Республика Корея',
    'RE' => 'Реюньон',
    'RU' => 'Россия',
    'RW' => 'Руанда',
    'RO' => 'Румыния',
    'SV' => 'Сальвадор',
    'WS' => 'Самоа',
    'SM' => 'Сан-Марино',
    'ST' => 'Сан-Томе и Принсипи',
    'SA' => 'Саудовская Аравия',
    'SZ' => 'Свазиленд',
    'MP' => 'Северные Марианские острова',
    'SC' => 'Сейшельские Острова',
    'BL' => 'Сен-Бартелеми',
    'MF' => 'Сен-Мартен',
    'PM' => 'Сен-Пьер и Микелон',
    'SN' => 'Сенегал',
    'VC' => 'Сент-Винсент и Гренадины',
    'KN' => 'Сент-Китс и Невис',
    'LC' => 'Сент-Люсия',
    'RS' => 'Сербия',
    'SG' => 'Сингапур',
    'SX' => 'Синт-Мартен',
    'SY' => 'Сирия',
    'SK' => 'Словакия',
    'SI' => 'Словения',
    'SB' => 'Соломоновы Острова',
    'SO' => 'Сомали',
    'SD' => 'Судан',
    'SU' => 'СССР',
    'SR' => 'Суринам',
    'US' => 'США',
    'SL' => 'Сьерра-Леоне',
    'TJ' => 'Таджикистан',
    'TH' => 'Таиланд',
    'TZ' => 'Танзания',
    'TC' => 'Тёркс и Кайкос',
    'TG' => 'Того',
    'TK' => 'Токелау',
    'TO' => 'Тонга',
    'TT' => 'Тринидад и Тобаго',
    'TV' => 'Тувалу',
    'TN' => 'Тунис',
    'TM' => 'Туркмения',
    'TR' => 'Турция',
    'UG' => 'Уганда',
    'UZ' => 'Узбекистан',
    'UA' => 'Украина',
    'WF' => 'Уоллис и Футуна',
    'UY' => 'Уругвай',
    'FO' => 'Фарерские острова',
    'FJ' => 'Фиджи',
    'PH' => 'Филиппины',
    'FI' => 'Финляндия',
    'FK' => 'Фолклендские острова',
    'FR' => 'Франция',
    'PF' => 'Французская Полинезия',
    'TF' => 'Французские Южные и Антарктические Территории',
    'HM' => 'Херд и Макдональд',
    'HR' => 'Хорватия',
    'CF' => 'ЦАР',
    'TD' => 'Чад',
    'ME' => 'Черногория',
    'CZ' => 'Чехия',
    'CL' => 'Чили',
    'CH' => 'Швейцария',
    'SE' => 'Швеция',
    'SJ' => 'Шпицберген и Ян-Майен',
    'LK' => 'Шри-Ланка',
    'EC' => 'Эквадор',
    'GQ' => 'Экваториальная Гвинея',
    'ER' => 'Эритрея',
    'EE' => 'Эстония',
    'ET' => 'Эфиопия',
    'ZA' => 'ЮАР',
    'GS' => 'Южная Георгия и Южные Сандвичевы острова',
    'SS' => 'Южный Судан',
    'JM' => 'Ямайка',
    'JP' => 'Япония'
);

$arGeoCodesEN = array(
    'AF' =>  'Afghanistan',
    'AX' =>  'Aland Islands',
    'AL' =>  'Albania',
    'DZ' =>  'Algeria',
    'AS' =>  'American Samoa',
    'AD' =>  'Andorra',
    'AO' =>  'Angola',
    'AI' =>  'Anguilla',
    'AQ' =>  'Antarctica',
    'AG' =>  'Antigua and Barbuda',
    'AR' =>  'Argentina',
    'AM' =>  'Armenia',
    'AW' =>  'Aruba',
    'AU' =>  'Australia',
    'AT' =>  'Austria',
    'AZ' =>  'Azerbaijan',
    'BS' =>  'Bahamas',
    'BH' =>  'Bahrain',
    'BD' =>  'Bangladesh',
    'BB' =>  'Barbados',
    'BY' =>  'Belarus',
    'BE' =>  'Belgium',
    'BZ' =>  'Belize',
    'BJ' =>  'Benin',
    'BM' =>  'Bermuda',
    'BT' =>  'Bhutan',
    'BO' =>  'Bolivia, Plurinational State of',
    'BQ' =>  'Bonaire, Sint Eustatius and Saba',
    'BA' =>  'Bosnia and Herzegovina',
    'BW' =>  'Botswana',
    'BV' =>  'Bouvet Island',
    'BR' =>  'Brazil',
    'IO' =>  'British Indian Ocean Territory',
    'BN' =>  'Brunei Darussalam',
    'BG' =>  'Bulgaria',
    'BF' =>  'Burkina Faso',
    'BI' =>  'Burundi',
    'KH' =>  'Cambodia',
    'CM' =>  'Cameroon',
    'CA' =>  'Canada',
    'CV' =>  'Cape Verde',
    'KY' =>  'Cayman Islands',
    'CF' =>  'Central African Republic',
    'TD' =>  'Chad',
    'CL' =>  'Chile',
    'CN' =>  'China',
    'CX' =>  'Christmas Island',
    'CC' =>  'Cocos (Keeling) Islands',
    'CO' =>  'Colombia',
    'KM' =>  'Comoros',
    'CG' =>  'Congo',
    'CD' =>  'Congo, the Democratic Republic of the',
    'CK' =>  'Cook Islands',
    'CR' =>  'Costa Rica',
    'CI' =>  'Cote d\'Ivoire',
    'HR' =>  'Croatia',
    'CU' =>  'Cuba',
    'CW' =>  'Curacao',
    'CY' =>  'Cyprus',
    'CZ' =>  'Czech Republic',
    'DK' =>  'Denmark',
    'DJ' =>  'Djibouti',
    'DM' =>  'Dominica',
    'DO' =>  'Dominican Republic',
    'EC' =>  'Ecuador',
    'EG' =>  'Egypt',
    'SV' =>  'El Salvador',
    'GQ' =>  'Equatorial Guinea',
    'ER' =>  'Eritrea',
    'EE' =>  'Estonia',
    'ET' =>  'Ethiopia',
    'FK' =>  'Falkland Islands (Malvinas)',
    'FO' =>  'Faroe Islands',
    'FJ' =>  'Fiji',
    'FI' =>  'Finland',
    'FR' =>  'France',
    'GF' =>  'French Guiana',
    'PF' =>  'French Polynesia',
    'TF' =>  'French Southern Territories',
    'GA' =>  'Gabon',
    'GM' =>  'Gambia',
    'GE' =>  'Georgia',
    'DE' =>  'Germany',
    'GH' =>  'Ghana',
    'GI' =>  'Gibraltar',
    'GR' =>  'Greece',
    'GL' =>  'Greenland',
    'GD' =>  'Grenada',
    'GP' =>  'Guadeloupe',
    'GU' =>  'Guam',
    'GT' =>  'Guatemala',
    'GG' =>  'Guernsey',
    'GN' =>  'Guinea',
    'GW' =>  'Guinea-Bissau',
    'GY' =>  'Guyana',
    'HT' =>  'Haiti',
    'HM' =>  'Heard Island and McDonald Islands',
    'VA' =>  'Holy See (Vatican City State)',
    'HN' =>  'Honduras',
    'HK' =>  'Hong Kong',
    'HU' =>  'Hungary',
    'IS' =>  'Iceland',
    'IN' =>  'India',
    'ID' =>  'Indonesia',
    'IR' =>  'Iran, Islamic Republic of',
    'IQ' =>  'Iraq',
    'IE' =>  'Ireland',
    'IM' =>  'Isle of Man',
    'IL' =>  'Israel',
    'IT' =>  'Italy',
    'JM' =>  'Jamaica',
    'JP' =>  'Japan',
    'JE' =>  'Jersey',
    'JO' =>  'Jordan',
    'KZ' =>  'Kazakhstan',
    'KE' =>  'Kenya',
    'KI' =>  'Kiribati',
    'KP' =>  'Korea, Democratic People\'s Republic of',
    'KR' =>  'Korea, Republic of',
    'KW' =>  'Kuwait',
    'KG' =>  'Kyrgyzstan',
    'LA' =>  'Lao People\'s Democratic Republic',
    'LV' =>  'Latvia',
    'LB' =>  'Lebanon',
    'LS' =>  'Lesotho',
    'LR' =>  'Liberia',
    'LY' =>  'Libya',
    'LI' =>  'Liechtenstein',
    'LT' =>  'Lithuania',
    'LU' =>  'Luxembourg',
    'MO' =>  'Macao',
    'MK' =>  'Macedonia, The Former Yugoslav Republic of',
    'MG' =>  'Madagascar',
    'MW' =>  'Malawi',
    'MY' =>  'Malaysia',
    'MV' =>  'Maldives',
    'ML' =>  'Mali',
    'MT' =>  'Malta',
    'MH' =>  'Marshall Islands',
    'MQ' =>  'Martinique',
    'MR' =>  'Mauritania',
    'MU' =>  'Mauritius',
    'YT' =>  'Mayotte',
    'MX' =>  'Mexico',
    'FM' =>  'Micronesia, Federated States of',
    'MD' =>  'Moldova, Republic of',
    'MC' =>  'Monaco',
    'MN' =>  'Mongolia',
    'ME' =>  'Montenegro',
    'MS' =>  'Montserrat',
    'MA' =>  'Morocco',
    'MZ' =>  'Mozambique',
    'MM' =>  'Myanmar',
    'NA' =>  'Namibia',
    'NR' =>  'Nauru',
    'NP' =>  'Nepal',
    'NL' =>  'Netherlands',
    'NC' =>  'New Caledonia',
    'NZ' =>  'New Zealand',
    'NI' =>  'Nicaragua',
    'NE' =>  'Niger',
    'NG' =>  'Nigeria',
    'NU' =>  'Niue',
    'NF' =>  'Norfolk Island',
    'MP' =>  'Northern Mariana Islands',
    'NO' =>  'Norway',
    'OM' =>  'Oman',
    'PK' =>  'Pakistan',
    'PW' =>  'Palau',
    'PS' =>  'Palestine, State of',
    'PA' =>  'Panama',
    'PG' =>  'Papua New Guinea',
    'PY' =>  'Paraguay',
    'PE' =>  'Peru',
    'PH' =>  'Philippines',
    'PN' =>  'Pitcairn',
    'PL' =>  'Poland',
    'PT' =>  'Portugal',
    'PR' =>  'Puerto Rico',
    'QA' =>  'Qatar',
    'RE' =>  'Reunion',
    'RO' =>  'Romania',
    'RU' =>  'Russian Federation',
    'RW' =>  'Rwanda',
    'BL' =>  'Saint Barthelemy',
    'SH' =>  'Saint Helena, Ascension and Tristan da Cunha',
    'KN' =>  'Saint Kitts and Nevis',
    'LC' =>  'Saint Lucia',
    'MF' =>  'Saint Martin (French part)',
    'PM' =>  'Saint Pierre and Miquelon',
    'VC' =>  'Saint Vincent and the Grenadines',
    'WS' =>  'Samoa',
    'SM' =>  'San Marino',
    'ST' =>  'Sao Tome and Principe',
    'SA' =>  'Saudi Arabia',
    'SN' =>  'Senegal',
    'RS' =>  'Serbia',
    'SC' =>  'Seychelles',
    'SL' =>  'Sierra Leone',
    'SG' =>  'Singapore',
    'SX' =>  'Sint Maarten (Dutch part)',
    'SK' =>  'Slovakia',
    'SI' =>  'Slovenia',
    'SB' =>  'Solomon Islands',
    'SO' =>  'Somalia',
    'ZA' =>  'South Africa',
    'GS' =>  'South Georgia and the South Sandwich Islands',
    'SS' =>  'South Sudan',
    'ES' =>  'Spain',
    'LK' =>  'Sri Lanka',
    'SD' =>  'Sudan',
    'SR' =>  'Suriname',
    'SJ' =>  'Svalbard and Jan Mayen',
    'SZ' =>  'Swaziland',
    'SE' =>  'Sweden',
    'CH' =>  'Switzerland',
    'SY' =>  'Syrian Arab Republic',
    'TW' =>  'Taiwan, Province of China',
    'TJ' =>  'Tajikistan',
    'TZ' =>  'Tanzania, United Republic of',
    'TH' =>  'Thailand',
    'TL' =>  'Timor-Leste',
    'TG' =>  'Togo',
    'TK' =>  'Tokelau',
    'TO' =>  'Tonga',
    'TT' =>  'Trinidad and Tobago',
    'TN' =>  'Tunisia',
    'TR' =>  'Turkey',
    'TM' =>  'Turkmenistan',
    'TC' =>  'Turks and Caicos Islands',
    'TV' =>  'Tuvalu',
    'UG' =>  'Uganda',
    'UA' =>  'Ukraine',
    'AE' =>  'United Arab Emirates',
    'GB' =>  'United Kingdom',
    'US' =>  'United States',
    'UM' =>  'United States Minor Outlying Islands',
    'UY' =>  'Uruguay',
    'UZ' =>  'Uzbekistan',
    'VU' =>  'Vanuatu',
    'VE' =>  'Venezuela, Bolivarian Republic of',
    'VN' =>  'Viet Nam',
    'VG' =>  'Virgin Islands, British',
    'VI' =>  'Virgin Islands, U.S.',
    'WF' =>  'Wallis and Futuna',
    'EH' =>  'Western Sahara',
    'YE' =>  'Yemen',
    'ZM' =>  'Zambia',
    'ZW' =>  'Zimbabwe'
);

header('Content-type: text/html;charset=windows-1251');

var_dump(getGeoLocation('91.230.211.234'));
/*
 array(3) {
  ["country"]=>
  string(6) "Россия"
  ["region"]=>
  string(17) "Красноярский край"
  ["city"]=>
  string(10) "Красноярск"
}
 */

var_dump(getGeoLocation('173.194.71.100'));