<?php
if (!session_id()) {
	session_start();
}
include('data.php');
include_once("lang_admin.php");
//require_once('galery/imagemagick.php');

//==============================================================================
function make_sql_insert($name_table, $array_flied)
{
	foreach ($array_flied as $k) {
		$flied[] = '`' . $k[0] . '`';
		$value[] = "'" . html_chars($k[1]) . "'";
	}
	$query = " INSERT INTO `" . $name_table . "` (" . implode(' , ', $flied) . ") \n VALUES (" . implode(' , ', $value) . ");";
	return $query;
}

//==============================================================================
function make_sql_update($name_table, $array_flied, $index, $newid = '')
{
	foreach ($array_flied as $k => $v) {
		if ($index != $k) $flied_value[] = '`' . $v[0] . '`=' . "'" . html_chars($v[1]) . "'";
	}
	$query = "UPDATE `" . $name_table . "` SET " . implode(' , ', $flied_value) .
		(!empty($newid) ? ', id = \'' . $newid . '\'' : '') .
		" WHERE " . $array_flied[$index][0] . " = '" . $array_flied[$index][1] . "'";
	return $query;
}

//==============================================================================
function select_for_print($name_table, $flied_id, $flied_search, $id)
{

	$query_country = "SELECT " . $flied_search . " FROM `" . $name_table . "` WHERE `" . $flied_id . "` ='" . $id . "'  LIMIT 0 , 100 ";
	//print_r($query_country);

	$result_country = @mysql_query($query_country) or die(mysql_error());
	if (mysql_num_rows($result_country) > 0) {
		$line_country = mysql_fetch_assoc($result_country);
	} else {
		$line_country[$flied_search] = 0;
	}

	return $line_country[$flied_search];
}

//==============================================================================
function select_for_print_where($name_table, $where, $search, $order = '')
{
	//global $HostLogin,$HostPassword,$HostBase;

	//$conect = conect_to_bd($HostLogin,$HostPassword,$HostBase);
	$query = "SELECT " . ($search != '' ? $search : '*') . " FROM `" . $name_table . "` WHERE  {$where} {$order} ";
	//print_r($query);
	$result = @mysql_query($query) or die(mysql_error());

	if ($result) {
		while ($line = mysql_fetch_assoc($result)) {
			if ($line['id'])
				$res[$line['id']] = $line;
			else $res[] = $line;
		}
		if ($res == '') {
			$res = array();
		}
		;
	}

	return $res;
}

;
// =============================================================================
function select_line_for_print($name_table, $flied_id, $id)
{

	$query = "SELECT * FROM `" . $name_table . "` WHERE `" . $flied_id . "` ='" . $id . "'  LIMIT 0 , 100 ";

	$result = @mysql_query($query) or die(mysql_error());
	$line = mysql_fetch_assoc($result);

	return $line;
}

//==============================================================================
function select_array($name_table, $id, $name, $where = '')
{

	$tores = array();
	$query = "SELECT `" . $id . "`,`" . $name . "` FROM `" . $name_table . "` " . $where . "";

	$result = @mysql_query($query) or die(mysql_error());

	while ($line = mysql_fetch_assoc($result)) {
		$tores[$line[$id]] = $line[$name];
	}

	return $tores;
}

//==============================================================================
function select_array_array($name_table, $id, $names, $where = '')
{

	$tores = array();
	$name = implode("`,`", $names);
	$query = "SELECT `" . $id . "`,`" . $name . "` FROM `" . $name_table . "` " . $where . "";
	$result = @mysql_query($query) or die(mysql_error());

	while ($line = mysql_fetch_assoc($result)) {
		$tores[$line[$id]] = array();
		foreach ($names as $v) {
			$tores[$line[$id]][$v] = $line[$v];
		}
	}

	return $tores;
}

//==============================================================================
function fast_connect_to_bd()
{
	global $HostLogin, $HostPassword, $HostBase, $HostHost, $lang_admin;

	$link_to_server = @mysql_connect($HostHost, $HostLogin, $HostPassword) or die($lang_admin['err_mysql_connect']);
	@mysql_select_db($HostBase) or die($lang_admin['err_mysql_db_select']);

	mysql_query('SET NAMES "UTF8"');
	mysql_query("SET collation_connection='utf8_general_ci'");
	mysql_query("SET collation_server='utf8_general_ci'");
	mysql_query("SET character_set_client='utf8'");
	mysql_query("SET character_set_connection='utf8'");
	mysql_query("SET character_set_results='utf8'");
	mysql_query("SET character_set_server='utf8'");
	/*  	mysql_query ("set character_set_client='cp1251'");
		mysql_query ("set character_set_results='cp1251'");
		mysql_query ("set collation_connection='cp1251_general_ci'");*/

	return $link_to_server;
}

//==============================================================================
function fast_connect_to_bd_de()
{
	global $HostLogin, $HostPassword, $HostBase, $HostHost, $lang_admin;
	$link_to_server = @mysql_connect($HostHost, $HostLogin, $HostPassword) or die($lang_admin['err_mysql_connect']);

	@mysql_select_db($HostBase) or die($lang_admin['err_mysql_db_select']);

	return $link_to_server;
}

//==============================================================================
function coder($word)
{
	$ret = md5(substr(md5($word), 0, 17));
	return $ret;
}

//==============================================================================
function check_user_login($login, $pass)
{
	global $pref;
	fast_connect_to_bd();
	$sql = "SELECT * FROM `" . $pref . "admin_users` WHERE `user_name`='" . html_chars($login) . "' AND `user_pass`='" . coder($pass) . "'";

	$res = mysql_query($sql)or die(mysql_error());
	if (@mysql_num_rows($res) == 1) {
		$line = mysql_fetch_assoc($res);
		return $line;
	}
	return false;
}

//==============================================================================
function update_user_login($login)
{
	global $pref;
	$sql = "UPDATE `" . $pref . "admin_users` SET `last_conn`=NOW() WHERE `user_name`='" . html_chars($login) . "'";
	$res = mysql_query($sql)or die(mysql_error());
}

//==============================================================================
function html_chars($text)
{
	$text = stripslashes($text);
	$text = str_replace('"', "&quot;", $text);
	$text = str_replace("'", "&#039;", $text);
	$text = preg_replace("/(<\/?)(.*?)([^>]*>)/e", "'\\1\\2'.html_entity_decode('\\3').'\\4\\5'", $text);
	return $text;
}

//==============================================================================
function sd($str)
{
	$str = stripslashes(trim($str));
	$search = array("'&'", "'\''", "'`'", "'\"'", "'<'", "'>'");
	$replace = array("&amp;", "&#039;", "&#039;", "&quot;", "&lt;", "&gt;");
	$str = preg_replace($search, $replace, $str);
	return $str;
}

//==============================================================================
function addphoto($upload_path, $file_array, $name, $width, $height)
{
	$tmp_name = $file_array['tmp_name'];
	$type = strtolower(substr($file_array['name'], -3));
	switch ($type) {
		case 'gif':
			$name_files = $name . ".gif";
			break;
		case 'jpg':
			$name_files = $name . ".jpg";
			break;
		case 'peg':
			$name_files = $name . ".jpg";
			break;
		case 'png':
			$name_files = $name . ".png";
			break;
		default:
			return false;
	}
	$name_file = $upload_path . $name_files;

	is_uploaded_file($tmp_name);

	if (is_uploaded_file($tmp_name)) {
		copy($tmp_name, $name_file);
	}


	$photo_size = getimagesize($name_file);
	switch ($photo_size[2]) {
		case 1:
			$photo_user = ImageCreateFromGif($name_file);
			break;
		case 2:
			$photo_user = ImageCreateFromJpeg($name_file);
			break;
		case 3:
			$photo_user = ImageCreateFromPng($name_file);
			break;
		default:
			return false;
	}
	$k_storon = $photo_size[1] / $photo_size[0];
	if ($photo_size[0] <= $width && $photo_size[1] <= $height) {
		return $name_files;
	}
	else {
		$k_w = $width - $photo_size[0];
		$k_h = $height - $photo_size[1];
		if ($k_w <= $k_h) {
			$bigphoto_w = $width;
			$bigphoto_h = $width * $k_storon;
			$newphoto_flag = 1;
		} else {
			$bigphoto_w = $height / $k_storon;
			$bigphoto_h = $height;
		}
	}

	$bigphoto = imagecreatetruecolor($bigphoto_w, $bigphoto_h);

	//        $bigphoto_itog = imagecopyresampled ($bigphoto, $photo_user, 0, 0, 0, 0, $bigphoto_w, $bigphoto_h, $photo_size[0], $photo_size[1]);
	if ($type == 'png') {
		imagealphablending($bigphoto, false);
		imagesavealpha($bigphoto, true);
		$transparent = imagecolorallocatealpha($bigphoto, 255, 255, 255, 127);
		imagefilledrectangle($bigphoto, 0, 0, $bigphoto_w, $bigphoto_h, $transparent);
	}
	$bigphoto_itog = imagecopyresampled($bigphoto, $photo_user, 0, 0, 0, 0, $bigphoto_w, $bigphoto_h, $photo_size[0], $photo_size[1]);
	switch ($type) {
		case 'gif':
			$bigphoto_itog2 = ImageGIF($bigphoto, $name_file);
			break;
		case 'png':
			$bigphoto_itog2 = ImagePNG($bigphoto, $name_file);
			break;
		case 'jpg':
			$bigphoto_itog2 = ImageJPEG($bigphoto, $name_file, 100);
			break;
		case 'peg':
			$bigphoto_itog2 = ImageJPEG($bigphoto, $name_file, 100);
			break;
		default:
			return false;
	}

	imagedestroy($bigphoto);

	return $name_files;
}

//==============================================================================
function addmagickphoto($upload_path, $file_array, $name, $width, $height)
{
	$tmp_name = $file_array['tmp_name'];
	$type = strtolower(substr($file_array['name'], -3));
	switch ($type) {
		case 'gif':
			$name_files = $name . ".gif";
			break;
		case 'jpg':
			$name_files = $name . ".jpg";
			break;
		case 'peg':
			$name_files = $name . ".jpg";
			break;
		case 'png':
			$name_files = $name . ".png";
			break;
		default:
			return false;
	}

	$name_file = $upload_path . '/' . $name_files;
	if (imageMagick::cutCenter($tmp_name, $name_file, $width, $height)) {
		return $name_files;
	} else {
		return null;
	}
}

//==============================================================================
function html_mail($to, $subject, $message, $from, $charset = 'windows-1251')
{

	$headers = 'From: ' . $from . "\r\n" .
		'Reply-To: ' . $from . "\r\n" .
		'MIME-Version: 1.0' . "\r\n" .
		'Content-Type: text/html; charset="' . $charset . '"' . "\r\n";
	return @mail($to, $subject, $message, $headers);
}

//==============================================================================
function prr($arr)
{
	print '<pre>';
	print_r($arr);
	print '</pre>';
}

//==============================================================================
$month = array(
	1 => '������',
	2 => '�������',
	3 => '�����',
	4 => '������',
	5 => '���',
	6 => '����',
	7 => '����',
	8 => '�������',
	9 => '��������',
	10 => '�������',
	11 => '������',
	12 => '�������'
);
$month1 = array(
	1 => '������',
	2 => '�������',
	3 => '����',
	4 => '������',
	5 => '���',
	6 => '����',
	7 => '����',
	8 => '������',
	9 => '��������',
	10 => '�������',
	11 => '������',
	12 => '�������'
);
$week_day = array(
	1 => '�����������',
	2 => '�������',
	3 => '�����',
	4 => '�������',
	5 => '�������',
	6 => '�������',
	0 => '�����������'

);
function date_to_ms($date)
{
	return mktime(0, 0, 0, substr($date, 5, 2), substr($date, 8, 2), substr($date, 0, 4));
}

function ms_to_date($ms)
{
	return date("d.m.y", $ms);
}

function date_to_date($date)
{
	//return substr($date,8,2).'.'.substr($date,5,2).'.'.substr($date,2,2);
	return date("d.m.y", strtotime($date));
}

function date_to_date2($date)
{
	//return substr($date,8,2).'.'.substr($date,5,2).'.'.substr($date,0,4);
	return date("d.m.Y H:i:s", strtotime($date));
}

function date_mysql_date($d, $m, $Y)
{
	return date("Y-m-d", mktime(0, 0, 0, $m, $d, $Y));
}

function dtm($date, $format = "d.m.Y")
{
	return date($format, strtotime($date));
}

function form_select_from_array($name_select, $array_select, $selected, $inc = '', $nul_select = '')
{
	$print_to_HTML = '<select size="1" name="' . $name_select . '" ' . $inc . '>';

	if ($nul_select != '') {
		if (($selected + 0) == 0) {
			$select .= '<option value="0" selected>' . $nul_select . '</option>\n';
		} else {
			$select .= '<option value="0">' . $nul_select . '</option>\n';
		}
	}

	foreach ($array_select as $v => $k) {
		if ($v == $selected) {
			$s = 'selected';
		} else {
			$s = '';
		}
		;
		$print_to_HTML .= '<option value="' . $v . '" ' . $s . ' >' . $k . '</option>';
	}

	$print_to_HTML .= '</select>';

	return $print_to_HTML;
}

function form_select_from_table($name_table, $where, $action, $name_select, $id_from_select, $file_from_name, $num_select, $order_by, $order = "ASC", $nul_select = '')
{
	$select = '<select name="' . $name_select . '" ' . $action . '>/n';

	if ($nul_select != '') {
		if (($selected + 0) == 0) {
			$select .= '<option value="0" selected>' . $nul_select . '</option>';
		} else {
			$select .= '<option value="0">' . $nul_select . '</option>';
		}
	}

	fast_connect_to_bd();

	$query = "SELECT * FROM `" . $name_table . "` " . $where . " ORDER BY `" . $order_by . "` " . $order . " ";
	$result = @mysql_query($query) or die(mysql_error());

	while ($line = mysql_fetch_assoc($result)) {
		if (($line[$id_from_select] + 0) == $num_select) {
			$select .= '<option value="' . $line[$id_from_select] . '" selected>' . $line[$file_from_name] . '</option>';
		} else {
			$select .= '<option value="' . $line[$id_from_select] . '">' . $line[$file_from_name] . '</option>';
		}
	}
	$select .= '</select>';

	return $select;
}

function errform($error)
{
	if ($error != '') {
		return '<tr>
					  <td width="50%"></td>
                      <td class="podmsel" align="left">' . $error . '</td>
                    </tr>';
	}
	return false;
}

//==============================================================================
function upload_or_not($up_file, $upload_path, $name_del, $name_old)
{ // die($upload_path);

	if ($up_file['size'] != 0 or $name_del != '') {
		@unlink($upload_path . "/" . $name_old);
		$image[4] = "";
	} else {
		$image[4] = @$name_old;
	}
	if ($up_file['size'] != 0) {
		$image = upload_pic2($up_file, $upload_path);
	}
	return $image[4];
}

//==============================================================================
$mime_types[0][0] = 'gif';
$mime_types[1][0] = 'image/gif';
$mime_types[0][1] = 'png';
$mime_types[1][1] = 'image/x-png';
$mime_types[0][2] = 'jpeg';
$mime_types[1][2] = 'image/pjpeg';
$mime_types[0][3] = 'jpg';
$mime_types[1][3] = 'image/jpeg';

str_replace('/', "\/", implode('|', $mime_types[0]));
function upload_pic2($array, $upload_path)
{

	global $mime_types, $pic_mask, $maxsize;

	$today = microtime();


	$file_name = translite($array['name']);
	$file_name = preg_replace("/[�-�,�-�,\s]{1,30}/", "1", $file_name);

	$file_type = $array['type'];

	$tmp_fname = $array['tmp_name'];

	$size = $array['size'];

	$ferr = $array['error'];

	if (is_uploaded_file($tmp_fname)) {

		if ($ferr == 0) {

			$name_ext = explode('.', $file_name);

			$ext = substr(strtolower($name_ext[count($name_ext) - 1]), 0, 3);

			//$filename=strtolower($name_ext[count($name_ext)-2]);
			$filename = strtolower(substr($file_name, 0, -(strlen($ext) + 1)));

			//if (preg_match('/^('.implode('|',$mime_types[0]).')$/',$ext)) { // � preg_match ��� ����������... :)
			if (1) {
				$copy_file_name[0] = 'true';

				//if ( preg_match('/^('.str_replace('/' ,"\/",implode('|',$mime_types[1])).')$/',$file_type)) {

				$copy_file_name[3] = 'true';

				$copy_file_name[1] = 'true';

				$copy_file_name[6] = $ext;

				$i = 1;
				$new_file_name = $filename;

				while (is_file($upload_path . $new_file_name . '.' . $ext))
				{
					$new_file_name = $filename . '_' . $i;
					$i++;
				}
				$copy_file_name[4] = "$new_file_name.$ext";

				if (copy($tmp_fname, $upload_path . $new_file_name . '.' . $ext)) {
					$copy_file_name[2] = 'true';
				} else {
					$copy_file_name[2] = 'false';
				}

			} else {
				$copy_file_name[0] = 'false';
				//$copy_file_name[$num] = "Error:All your files types should be gif,png,jpeg,jpg !" ;
			}
		}
	}
	return $copy_file_name;

}

function watermark($sImgPath, $sText, $iFontSize = 10, $iXPadding = 5, $iYPadding = 5, $iOpacity = 0)
{
	$sFont = 'arialbd.ttf';

	$aSpl = split("\.", $sImgPath);
	$sExt = $aSpl[count($aSpl) - 1];

	switch ($sExt) {
		case "jpg":
			$rImage = imagecreatefromjpeg($sImgPath);
			break;
		case "jpeg":
			$rImage = imagecreatefromjpeg($sImgPath);
			break;
		case "gif":
			$rImage = imagecreatefromgif($sImgPath);
			break;
		case "png":
			$rImage = imagecreatefrompng($sImgPath);
			break;
		default:
			return false;
			break;
	}

	$aBbox = imagettfbbox($iFontSize * 1.1, 0.0, $sFont, $sText);
	$iTextWidth = abs($aBbox[2]) + abs($aBbox[0]);
	$iTextHeight = abs($aBbox[5]) + abs($aBbox[3]) + 2;
	$iImageWidth = imagesx($rImage);
	$iImageHeight = imagesy($rImage);
	$iDX = $iImageWidth - $iTextWidth - $iXPadding;
	$iDY = $iImageHeight - $iYPadding;
	$iColor = imagecolorallocatealpha($rImage, 255, 253, 230, $iOpacity);
	imagettftext($rImage, $iFontSize * 1.1, 0.0, $iDX, $iDY, $iColor, $sFont, $sText);

	switch ($sExt) {
		case "jpg":
			imagejpeg($rImage, $sImgPath);
			break;
		case "jpeg":
			imagejpeg($rImage, $sImgPath);
			break;
		case "gif":
			imagegif($rImage, $sImgPath);
			break;
		case "png":
			imagepng($rImage, $sImgPath);
			break;
	}
}

function win2uni($s)
{
	$s = convert_cyr_string($s, 'w', 'i');
	for ($result = '', $i = 0; $i < strlen($s); $i++) {
		$charcode = ord($s[$i]);
		$result .= ($charcode > 175) ? "&#" . (1040 + ($charcode - 176)) . ";" : $s[$i];
	}
	return $result;
}

function showbanner($file = null, $url = null)
{

	if ($file) {
		$type = strtolower(substr($file, -3)); //Проверяем расширение
		$size = getimagesize($file); //Размер баннера
		$picts = array('gif', 'jpg', 'png');
		if ($type == 'swf') {
			//Flash
			$toshow =
				'<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" width="' . $size[0] . '" height="' . $size[1] . '">
	<param name="movie" value="' . $file . '">
	<param name="menu" value="false">
	<param name="quality" value="high">
	<param name="swliveconnect" value="true">
	<param name="wmode" value="opaque">
	<param name="AllowScriptAccess" value="always">
	<embed src="' . $file . '" width="' . $size[0] . '" height="' . $size[1] . '" menu="false" quality="high"	swliveconnect="true" wmode="opaque" AllowScriptAccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"></embed><noembed></noembed>
</object>';
		} elseif (in_array($type, $picts)) {
			//Pict
			$toshow = '<img src="' . $file . '" border="0">';
			if ($url) {
				$toshow = '<a href="' . $url . '" target="_blank">' . $toshow . '</a>';
			}
		}
		return $toshow;
	}
	return;
}

function translite($string)
{
	$rus = array("ё", "й", "ю", "ь", "ч", "щ", "ц", "у", "к",
		"е", "н", "г", "ш", "з", "х", "ъ", "ф", "ы", "в",
		"а", "п", "р", "о", "л", "д", "ж", "э", "я", "с",
		"м", "и", "т", "б", "Ё", "Й", "Ю", "Ч", "Ь",
		"Щ", "Ц", "У", "К", "Е", "Н", "Г", "Ш", "З",
		"Х", "Ъ", "Ф", "Ы", "В", "А", "П", "Р", "О",
		"Л", "Д", "Ж", "Э", "Я", "С", "М", "И", "Т", "Б");
	$eng = array("yo", "iy", "yu", "'", "ch", "sh", "c", "u", "k", "e",
		"n", "g", "sh", "z", "h", "'", "f", "y", "v", "a",
		"p", "r", "o", "l", "d", "j", "е", "ya", "s", "m",
		"i", "t", "b", "Yo", "Iy", "Yu", "CH", "'", "SH",
		"C", "U", "K", "E", "N", "G", "SH", "Z", "H", "'",
		"F", "Y", "V", "A", "P", "R", "O", "L", "D", "J",
		"E", "YA", "S", "M", "I", "T", "B");

	$bad_chas = array(' ', ',', '-', '\\', '\/', '*',
		'!', '~', '`', '@', '"', '\'', '%', '^',
		';', '#', '№', ':', '&', '?', '(', ')',
		'>', '<', '}', '{', '[', ']', '_', '$',
		'/', '+', '=');

	$string = str_replace($rus, $eng, $string);
	$string = str_replace($bad_chas, '', $string);
	$string = strtolower($string);
	/***
	функция str_replace находит значения в строке и заменяет их новой. здесь мы повторили весь алфавит, как видите  ::):
	 ***/
	if (!empty($string)) {
		return $string;
	} // если строка не пуста, возвращаем строку
	else return ("String empty/Строка пуста"); // а если пуста, орем во всю глотку xD
}


