<?php
defined('_JEXEC') or die;


class ModRuCitiesHelper
{
    public $def = 'RU_Москва_0_Московская обл.';

    public static function getAjax()
    {
        $module = JModuleHelper::getModule('mod_ru_cities');
        $params = new JRegistry($module->params);
        $html = '';
        if (!isset($_GET['mod'])) {
            return '';
        } elseif ($_GET['mod'] == 'bigbox') {
            $str = '';
            if (isset($_COOKIE['geobase'])) {
                $str = $_COOKIE['geobase'];
            }
            $data = self::parceCity($str);

            $country = $data['country']?$data['country']:'';
            $city = $data['city']?', г.'.$data['city']:'';
            $region = $data['region']?', '.$data['region']:'';

            $html .= '<div class="bigboxtitle">'.$params->get('txt1', '').'</div>';
            $html .= '<div class="bigboxcity">'.$data['city'].'</div>';
            $html .= '<div class="bigboxdesk">'.$country.$region.$city.'</div>';
            $html .= '<h3>'.$params->get('txt2', '').'</h3>';
            $html .= '<div class="bigboxdesk">'.$params->get('txt3', '').'</div>';
            $html .= '<div class="bigboxinput"><input type="text" placeholder="Поиск"><i class="fa fa-search" aria-hidden="true"></i></div>';
            $html .= '<div class="bigboxchooserbox"></div>';
            $html .= '<div class="bigboxvars">'.self::startvars().'</div>';
            $html .= '<div class="bigboxatr"><a href="http://plasma-web.ru/">модуль выбора города</a></div>';
            return $html;
        } elseif ($_GET['mod'] == 'bigboxcities') {
            if ($_GET['text']) {
                $data = array();
                $arr = file(__DIR__ . '/assets/cities.ini');
                foreach ($arr as $ar) {
                    if (strpos(mb_strtolower($ar, 'UTF-8'), (mb_strtolower($_GET['text'], 'UTF-8'))) === 3) {
                        $data[] = self::parceCity($ar);
                        if (sizeof($data)>9) {
                            break;
                        }
                    }
                }
                foreach ($data as $dat) {
                    $country = $dat['country']?', '.$dat['country']:'';
                    $city = $dat['city']?$dat['city']:'';
                    $region = $dat['region']?', '.$dat['region']:'';
                    $html .= '<a href="javascript:void(0)" data-city="'.$dat['cntr'].'_'.$city.'">'.$city.$country.$region.'</a>';
                }
                if ($html) {
                    $html = '<div class="bigboxchooser">'.$html.'</div>';
                }
            }
            return $html;
        } elseif ($_GET['mod'] == 'bigboxcity') {
            if ($_GET['city']) {
                $arr = file(__DIR__ . '/assets/cities.ini');
                foreach ($arr as $ar) {
                    if (strpos(mb_strtolower($ar, 'UTF-8'), (mb_strtolower($_GET['city'], 'UTF-8'))) === 0) {
                        setcookie('geobase', $ar, time()+3600*24*30, '/');
                        return 'y';
                    }
                }
            }
        }
    }

    public function get_value($key = false, $cookie = true)
    {
        // $this->get_geobase_data();


        if ($cookie && isset($_COOKIE['geobase'])) {
            $data = $this->parceCity($_COOKIE['geobase']);
        } else {
            $str = $this->get_geobase_data();
            setcookie('geobase', $str, time()+3600*24*30, '/');
            $data = $this->parceCity($str);
        }

        if ($key) {
            return $data[$key];
        } else {
            return $data;
        }
    }

    // public function get_geobase_data_old()
    // {
    //     $link = 'ipgeobase.ru:7020/geo?ip='.$this->get_ip();
    //     $ch = curl_init();
    //     curl_setopt($ch, CURLOPT_URL, $link);
    //     curl_setopt($ch, CURLOPT_HEADER, false);
    //     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    //     curl_setopt($ch, CURLOPT_TIMEOUT, 3);
    //     curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3);
    //
    //     $string = curl_exec($ch);
    //     $string = iconv('windows-1251', 'utf-8', $string);
    //
    //     $pa['country'] = '#<country>(.*)</country>#is';
    //     $pa['city'] = '#<city>(.*)</city>#is';
    //     $pa['region'] = '#<region>(.*)</region>#is';
    //
    //     $data = array();
    //     foreach ($pa as $key => $pattern) {
    //         preg_match($pattern, $string, $out);
    //         if (isset($out[1]) && $out[1]) {
    //             $data[$key] = trim($out[1]);
    //         } else {
    //             $data[$key] = '';
    //         }
    //     }
    //     return $data['country'].'_'.$data['city'].'_0_'.$data['region'];
    // }

    public function get_geobase_data() {
        $ip = $this->get_ip();
        $def = $this->def;
        if(!$ip) return $def;

        $ips = explode('.', $ip);
        $del = $ips[0]*256*256*256+$ips[1]*256*256+$ips[2]*256+$ips[3];
        $arr = file(__DIR__ . '/assets/geo_files/cidr_optim.txt');
        $str = '';

        foreach ($arr as $ar) {
            if((int) $ar < $del) {
                $str = $ar;
            }
            else {
                break;
            }
        }

        if($str) {
            $locs = explode("\t", $str);

            $city = '_0_0_0';
            $cityid = (int) $locs[4];

            if($cityid) {
                $arr = file(__DIR__ . '/assets/geo_files/cities.txt');

                foreach ($arr as $ar) {
                    if((int) $ar == $cityid) {
                        $ar = iconv('windows-1251', 'utf-8', $ar);
                        $ars = explode("\t", $ar);
                        $city = '_'.$ars[1].'_'.$ars[2];
                        break;
                    }
                    elseif((int) $ar > $cityid) {
                        break;
                    }
                }

            }

            $str = $locs[3].$city;
        }
        else {
            $str = $def;
        }

        return $str;
    }

    public function get_ip()
    {
        $ip = false;
        if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            $ipa[] = trim(strtok($_SERVER['HTTP_X_FORWARDED_FOR'], ','));
        }

        if (isset($_SERVER['HTTP_CLIENT_IP'])) {
            $ipa[] = $_SERVER['HTTP_CLIENT_IP'];
        }

        if (isset($_SERVER['REMOTE_ADDR'])) {
            $ipa[] = $_SERVER['REMOTE_ADDR'];
        }

        if (isset($_SERVER['HTTP_X_REAL_IP'])) {
            $ipa[] = $_SERVER['HTTP_X_REAL_IP'];
        }

        foreach ($ipa as $ips) {
            if (preg_match("#^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$#", $ips)) {
                $ip = $ips;
                break;
            }
        }
        return $ip;
    }

    public static function startvars()
    {
        $html = '';
        $vars = array('Санкт-Петербург', 'Москва', 'Владимир', 'Белгород', 'Нижний Новгород', 'Саратов', 'Воронеж', 'Пермь', 'Тверь', 'Екатеринбург', 'Ростов', 'Тула', 'Иваново', 'Ростов-на-Дону', 'Уфа', 'Казань', 'Рязань', 'Челябинск', 'Краснодар','Самара','Ярославль');
        foreach ($vars as $var) {
            $html .= '<div><a href="javascript:void(0)" data-city="RU_'.$var.'">'.$var.'</a></div>';
        }
        return $html;
    }

    public static function parceCity($str)
    {

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

        $city = array();
        $data = explode('_', $str);

        $city['cntr'] = $data[0];

        if (isset($countries[$data[0]])) {
            $city['country'] = $countries[$data[0]];
        } else {
            $city['country'] = $data[0];
        }

        if (isset($data[1]) && trim($data[1])) {
            $city['city'] = $data[1];
        } else {
            $city['city'] = '';
        }

        if (isset($data[3]) && trim($data[3])) {
            $city['region'] = $data[3];
        } else {
            $city['region'] = '';
        }
        return $city;
    }
}
