<?php
class system {

// Фильтрация.
	public static function check($msg) {
		if (is_array($msg)) {
			foreach($msg as $key => $val) {
				$msg[$key] = self::check($val);
			}
		} else {
			$msg = htmlspecialchars($msg);
			$search = array(' ','|', '\'', '$', '\\', '^', '%', '`', "\0", "\x00", "\x1A", chr(226) . chr(128) . chr(174));
			$replace = array(' ','&#124;', '&#39;', '&#36;', '&#92;', '&#94;', '&#37;', '&#96;', '', '', '', '');
			$msg = str_replace($search, $replace, $msg);
			$msg = stripslashes(trim($msg));
		}
		return $msg;
	}

// Вывод ошибок, текста.
	public static function show($message=NULL,$err=0) {
		global $user;
		if($message != NULL) {
		?>
		<div class="note-<?=($err == 0 ? "error" : "success" )?>"><?=$message?></div>
		<?php
		}
	}

// Перенаправление.
	public static function redirect($message, $redirect, $status = 0) {
		if($message != NULL) {
			$stat = ($status == 0 ? "note" : "error" );
			$_SESSION[$stat] = $message;
		}
		//echo '<meta http-equiv="refresh" content="0; URL=\''.$redirect.'\'" />';
		header("Location: {$redirect}");
		die();
		return;
	}

// Форматирование текста.
	public static function textOut($msg, $br = ' <br/> ') {
	    $msg = emoji::smile($msg);
		return str_replace("\r\n", $br, str_replace("\n", $br, $msg));
	}

    public static function BBcode($msg)
    {
        static $cacheStickers = [];

        if (preg_match('/^\[stickers=([0-9]{1,9}+)\]$/', $msg, $m) === 1 && count($m) > 1) {
            $idStickers = (int)$m[1];
            if (isset($cacheStickers[$idStickers]) === true) {
                return $cacheStickers[$idStickers];
            }

            $getData = DB::$pdo->queryFetch("SELECT image FROM `stickers` WHERE id = ? LIMIT 1", [
                $idStickers
            ]);
            if ($getData !== false) {
                $cacheStickers [$idStickers] = '<img src="' . FILES_SERVER . 'stickers/' . $getData['image'] . '" height="128">';
                return $cacheStickers [$idStickers];
            }
        }

        $listDomain = "place|camera|info|name|academy|aero|arpa|coop|media|museum|mobi|travel|xxx|asia|biz|com|net|org|gov|mil|edu|int|tel|ac|ad|ae|af|ag|ai|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|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|eh|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|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|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pr|ps|pt|pw|py|qa|re|ro|ru|rs|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw|cat|pro|local|рф";
        $bbcode = array(
            '/#((?!_)\d*[A-z_а-я]+\d*)/ui' => '<a href="/?q=$1">#$1</a>',
            '/(https?:\/\/)?([\w\.\-]+)\.(' . $listDomain . '\.?)([\w\-\_#%&?+\/\.=;:~]*)*\/?/i' => '<a href="$0">$0</a>'
            //'~(?:(?:http(s?)|ftp|telnet)://(?:[a-z0-9_-]{1,32}(?::[a-z0-9_-]{1,32})?@)?)?(?:(?:[a-z0-9-]{1,128}\.)+(?:ru|su|com|net|org|mil|edu|arpa|gov|biz|info|aero|inc|name|[a-z]{2})|(?!0)(?:(?!0[^.]|255)[0-9]{1,3}\.){3}(?!0|255)[0-9]{1,3})(?:/[a-z0-9.;,_@%&?+=\~/-]*)?(?:#[^ \'\"&]*)?~im' => '<a href="$0">$0</a>'
        );
        $msg = preg_replace(array_keys($bbcode), array_values($bbcode), $msg);
        return $msg;
    }
///(https?\:\/\/((\w+\-*.)+)?(\w+\-*)+\.{1}(?:рф|com|aero|biz|com|coop|edu|eu|gov|info|int|mil|museum|name|net|org|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|eh|er|es|et|eu|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|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|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|nu|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|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw)(?::\d+)?(\/\S*)?)/
// Вывод времени.
	public static function times($time = NULL) {
		global $user;
		if(!empty($user['id'])) {
            $time += $user['timezone'];
        }
	    $timep="".date("j M".(date("Y", $time) != date("Y") ? " Y" : "" )." в H:i", $time)."";
	    $time_p[0]=date("j n Y", $time);
	    $time_p[1]=date("H:i", $time);

	    if ($time_p[0]==date("j n Y"))$timep=date("H:i", $time);
	    if ($time_p[0]==date("j n Y"))$timep=date("H:i", $time);
	    if ($time_p[0]==date("j n Y", time()-60*60*24)) $timep="вчера в ".$time_p[1];

		$rep = array(
			"Jan" 		=>			"янв",
			"Feb" 		=>			"фев",
			"Mar" 		=>			"мар",
			"May"		=>			"мая",
			"Apr" 		=>			"апр",
			"Jun" 		=>			"июн",
			"Jul" 		=>			"июл",
			"Aug" 		=>			"авг",
			"Sep" 		=>			"сен",
			"Oct" 		=>			"окт",
			"Nov" 		=>			"ноя",
			"Dec" 		=>			"дек"
		);
		$timep = @str_replace(array_keys($rep), array_values($rep), $timep);
		return $timep;
	}

// Кол-во символов UTF-8.
	public static function utf_strlen($msg) {
		$msg = str_replace(" ","",$msg);
		if (function_exists('mb_strlen')) return mb_strlen($msg, 'utf-8');
		if (function_exists('iconv_strlen')) return iconv_strlen($msg, 'utf-8');
		if (function_exists('utf8_decode')) return strlen(utf8_decode($msg));
		return strlen(utf_to_win($msg));
	}
// Вывод страницы ошибки 
	public static function error()
	{
		return self::show('Страница не найдена.');
	}


public static function count($num){
	if(is_array($num))
	{
		foreach($num as $k => $v)
		{
			$num[$k] = self :: count($v);
		}
	} else {
		if($num == 0) { $num = 0; }	else{ $num = intval($num); }
	}
	return $num;
}

// Проверка на путоту. Зафиксированый баг.
	public static function noempty($v)
	{
		if(empty($v) && $v != "0"){ $r = false; } else { $r = true; }
		return $r;
	}

// Измеряем память в байтах
	public static function FBytes($bytes, $precision = 2) {
		$units = array('B', 'KB', 'MB', 'GB', 'TB');
		$bytes = max($bytes, 0);
		$pow = floor(($bytes?log($bytes):0)/log(1024));
		$pow = min($pow, count($units)-1);
		$bytes /= pow(1024, $pow);
		return round($bytes, $precision).' '.$units[$pow];
	}

// Обрезание текста.
	public static function cutText($str, $len = 100)
	{
			// Обрезаем текст до нужного кол-ва символов.
		$str = @substr($str, 0, $len);
			// Если символов больше, чем нужно, то добавляем "...".
		if(@strlen($str) >= $len){ $str .= "..."; }

		return $str;
	}

	public static function vail($int, $expressions, $retNum = true)
	{
		if (count($expressions) < 3)$expressions[2] = $expressions[1];
		$count = $int%100;
		if ($count >= 5 && $count <= 20)$result = 2;
		else $count = $count%10;
		if ($count == 1)$result = 0;
		elseif($count >= 2 && $count <= 4)$result = 1;
		else $result = 2;
		return ($retNum == true ? $int.' ' : '' ).$expressions[$result];
	}
// Ф-ция вывода сколько монет
	public static function coins($c) {
		return $c." ".profile :: getPhrase($c,['монета','монеты','монет']);
	}

//Ф-ция вывода ошибок и успешного выполнения действия 	
	public static function notes() {
		if(isset($_SESSION['note'])){ ?><div class="note-success"><?=($_SESSION['note'])?></div><?php }
		if(isset($_SESSION['error'])){ ?><div class="note-error"><?=self::check($_SESSION['error'])?></div><?php }
		return;
	}

// Удаление не читаемых символов. Ничего не менять!
	public static function text($s)
	{
		$array_edit = array(
			' '			=>			"",		// nbsp
			' '			=>			"",		// en space
			' '			=>			"",		// em space
			' '			=>			""	    // thin space
		);
		$s = @str_replace(array_keys($array_edit), array_values($array_edit), $s);
		return trim($s);
	}

// Тoлько цифры.
	public static function num($n) {
		return abs(intval($n));
	}

// Генерация хэша.
	public static function genHash($t, $int) {
		return (md5(md5($t).'loli'.md5($t).'loli').$int.md5('uoi!hrenVamSuchki!:* текст чтобы точно не хакнули.hentai').$int);
	}

// Вывод иконок.
	public static function icon($i, $s = NULL) {
		$s .= "vertical-align: top;";
		return " <img src=\"/template/icons/{$i}.png\" ".($s != NULL ? "style=\"".$s."\"" : '')." /> ";
	}
	public static function ico($i) {
		return "<span class=\"ico ico-{$i}\"></span>";
	}
// Ф-ция назад
	public static function touch($l = NULL, $t = NULL) {
		return '<div class="touch"><a href="'.$l.'" class="touch-cont _oh">'.$t.'</a></div>';
	}
// Ф-ция наза для пк
	public static function back($l = NULL, $t = NULL, $x = false) {
		return '<div '.($x == true ? "id='app-ajax-back' " : '' ).'class="touch-back"><a href="'.$l.'" class="touch-cont">'.self :: icon('arr-l').$t.'</a></div>';
	}

// Ф-ция активация email 
	public static function activateMail($id,$mail,$act) {

		$vseti = 'vineti.ru';
		$email_a = 'activate@vineti.ru';
		$message = ' 
		Поздравляем с регистрацией на '.$vseti.'.

		Чтобы подтвердить регистрацию, пожалуйста, откройте ссылку:

		http://vineti.ru/activate?user='.$id.'&key='.$act.'

		После подтверждения можно полностью пользоваться сайтом.

		Пожалуйста, никому не доверяйте данные от Вашего аккаунта.

		---

		Вы получили это сообщение, потому что Ваш email-адрес был зарегистрирован на сайте '.$vseti.'.
		Если данное письмо попало к Вам по ошибке, пожалуйста, проигнорируйте его и примите наши извинения.

		С наилучшими пожеланиями,
		Администрация сайта vineti.ru';
		$r = mail($mail, '=?utf-8?B?'.base64_encode('Регистрация на '.$vseti).'?=', $message, "From: $email_a\r\nContent-type: text/plain; charset=utf-8;\r\nX-Mailer: PHP;");
		return $r;
	}
// Ф-ция востановления пароля по email
	public static function restoreMail($email, $key)
	{
		if (empty($email) || empty($key))
		{
			return exit('Empty data.');
		}
		else
		{
			$vseti = 'vineti.ru';
			$email_a = 'restore@vineti.ru';
			$message = ' 
			Мы получили запрос на восстановление пароля к Вашему аккаунту.

			Чтобы продолжить восстановление, пожалуйста, откройте ссылку:

			http://vineti.ru/restore?key='.$key.'

			Пожалуйста, никому не доверяйте данные от Вашего аккаунта.

			---

			Вы получили это сообщение, потому что Ваш email-адрес был зарегистрирован на сайте '.$vseti.'.
			Если данное письмо попало к Вам по ошибке, пожалуйста, проигнорируйте его и примите наши извинения.

			С наилучшими пожеланиями,
			Администрация сайта vineti.ru';
			$r = mail($email, '=?utf-8?B?'.base64_encode('Восстановление пароля').'?=', $message, "From: $email_a\r\nContent-type: text/plain; charset=utf-8;\r\nX-Mailer: PHP;");
			return $r;
		}
	}

	public static function dsCrypt($input,$decrypt=false) {
	    $o = $s1 = $s2 = array(); // Arrays for: Output, Square1, Square2
	    // формируем базовый массив с набором символов
	    $basea = array('?','(','@',';','$','#',"]","&",'*'); // base symbol set
	    $basea = array_merge($basea, range('a','z'), range('A','Z'), range(0,9) );
	    $basea = array_merge($basea, array('!',')','_','+','|','%','/','[','.',' ') );
	    $dimension=9; // of squares
	    for($i=0;$i<$dimension;$i++) { // create Squares
	        for($j=0;$j<$dimension;$j++) {
	            $s1[$i][$j] = $basea[$i*$dimension+$j];
	            $s2[$i][$j] = str_rot13($basea[($dimension*$dimension-1) - ($i*$dimension+$j)]);
	        }
	    }
	    unset($basea);
	    $m = floor(strlen($input)/2)*2; // !strlen%2
	    $symbl = $m==strlen($input) ? '':$input[strlen($input)-1]; // last symbol (unpaired)
	    $al = array();
	    // crypt/uncrypt pairs of symbols
	    for ($ii=0; $ii<$m; $ii+=2) {
	        $symb1 = $symbn1 = strval($input[$ii]);
	        $symb2 = $symbn2 = strval($input[$ii+1]);
	        $a1 = $a2 = array();
	        for($i=0;$i<$dimension;$i++) { // search symbols in Squares
	            for($j=0;$j<$dimension;$j++) {
	                if ($decrypt) {
	                    if ($symb1===strval($s2[$i][$j]) ) $a1=array($i,$j);
	                    if ($symb2===strval($s1[$i][$j]) ) $a2=array($i,$j);
	                    if (!empty($symbl) && $symbl===strval($s2[$i][$j])) $al=array($i,$j);
	                }
	                else {
	                    if ($symb1===strval($s1[$i][$j]) ) $a1=array($i,$j);
	                    if ($symb2===strval($s2[$i][$j]) ) $a2=array($i,$j);
	                    if (!empty($symbl) && $symbl===strval($s1[$i][$j])) $al=array($i,$j);
	                }
	            }
	        }
	        if (sizeof($a1) && sizeof($a2)) {
	            $symbn1 = $decrypt ? $s1[$a1[0]][$a2[1]] : $s2[$a1[0]][$a2[1]];
	            $symbn2 = $decrypt ? $s2[$a2[0]][$a1[1]] : $s1[$a2[0]][$a1[1]];
	        }
	        $o[] = $symbn1.$symbn2;
	    }
	    if (!empty($symbl) && sizeof($al)) // last symbol
	        $o[] = $decrypt ? $s1[$al[1]][$al[0]] : $s2[$al[1]][$al[0]];
	    return implode('',$o);
	}


// Создание дерева директорий
	public static function createDir($p = NULL) {

		if(!file_exists(FILES_PATH.$p)) {
			$arr = explode('/', $p);
			$curr=array();
			foreach($arr as $key => $val){ if(isset($val) && $val != ""){
			    $curr[]=$val;
			    $p = FILES_PATH.implode('/',$curr)."/";
			    if(!is_dir($p)){ mkdir($p, 0777); }
			}}
		}
	}

// Получение текущей директории для загрузки фоток
	public static $photosDir = "photos/";
	public static function photosGetLink($std = false, $id = 0, $hash = 0) {

		return ($std ? self :: $photosDir : '').($id > 0 ? intval($id/1000)."/{$id}/" : '').($hash === 0 ? (idate("Y") * pow(idate("y"), 2))."/".(idate("z")*(365+idate("L")))."/" : $hash );
	}

	public static function photosGetView($hash,$size = 0) {
		$sizes = ['','_64x','_128x','_150x','_256x','_512x','_1080x'];
		return self :: photosGetLink(true,0,$hash).(isset($sizes[$size]) ? $sizes[$size] : '' ).".jpg";
	}

	public static function photosGetCover($id) {

		$r = DB :: $pdo -> queryFetch("SELECT `hash` FROM `photos` WHERE `id_album` = ? ORDER BY `id` DESC LIMIT 1;", array($id));

		return isset($r['hash']) ? system :: photosGetView($r['hash'],3) : self :: $photosDir . '0.jpg';
	}

	//Хеш пароли

	public static function bhash($a)
	{
	    return md5('~' . md5('~' . $a . '~') . '~');
	}

    /**
     * @param array $_files
     */
    public static function fixFilesMultiple(array &$_files)
    {
        $tmpFiles = $_files;
        $_files = [];
        foreach ($tmpFiles as $var => $params)
            foreach ($params as $name => $i) {
                if(is_array($i) === false) {
                    $_files[$var][$name] = $i;
                    continue;
                }
                foreach ($i as $num => $val)
                    $_files[$var][$num][$name] = $val;
            }

    }
}

class Events {
	public static function add($data = []) {
		if (empty($data['id_user']) or empty($data['type'])) {
			return false;
		}
		if (empty($data['data'])) {
			$data['data'] = false;
		}
		if (empty($data['id_type'])) {
			$data['id_type'] = false;
		}
		$sqlType = "`friends` where `id_friend` = '{$data['id_user']}'";
		if ($data['type'] == 'groups') {
			$sqlType = "`groups_users` where `id_group` = '{$data['data']}'";
		}
		$querys = DB::$pdo->query("SELECT * FROM {$sqlType} ORDER BY `id` DESC limit 999");
		while($p = $querys->fetch()) {
			$db = DB::$pdo->query("INSERT INTO `events` (`id_user`, `date_create`, `key`, `type`, `id_type`, `data`) 
				VALUES (?, ?, ?, ?, ?, ?);",
				[
					$p['id_user'],
					time(),
					md5(time() . mt_rand(1,99999)),
					$data['type'],
					$data['id_type'],
					$data['data']
				]
			);
		}
		return $p;
	}
}
