<?php
/**
* @author:  Bunzia Alexander <nifus@mail.ru> <http://www.weblancer.net/users/nifus/>
* @copyright: Copyright (c) 2010, Bunzia Alexander
* @version: 1.0
* @license: http://www.gnu.org/copyleft/gpl.html GNU/GPL
* @package: HiLo CMS
*/



include_once(MAIN_SOURCE_PATH.'/modules/users/inc/url.php');
include_once(MAIN_SOURCE_PATH.'/modules/users/lang/'.MAIN_LANG.'/lang.php');

	//	класс запросов к таблице пользователей
class u_query extends query{
	
	//private $last_error = false;
	
	public function __construct($alias='u'){
	global $MAIN_DB;
		$this -> set_table( MAIN_USERS_TBL );
		$this -> set_alias($alias);
		include_once(MAIN_SOURCE_PATH.'/modules/users/cache/config.php');
	}	
	
	public function include_groups($alias,$cols=''){
		$this -> include_table( MAIN_GROUP_TBL ,$alias,'g_id',$cols );
	}
	
	public function include_banned($alias,$cols=''){
	global $MAIN_DB;
		$this -> include_table( $MAIN_DB -> prefix('users_ban') ,$alias,'u_id',$cols );
	}
	
	public function where_id($id){
		$id = intval($id);
		if ( empty($id) ){
			return false;
		}
		return $this -> set_where( $this -> alias.'.u_id',$id);
	}
	
	
	public function where_not_id($id){
		$id = intval($id);
		if ( empty($id) ){
			return false;
		}
		return $this -> set_anothe_where( $this -> alias.'.u_id!= "'.$id.'"');
	}
	
	
	public function where_login($l){
		$error_login = users::error_login($l);
		if ( $error_login ){
			return false;
		}
		return $this -> set_where( $this -> alias.'.u_login',$l);
	}
	
		
	public function where_actcode($v){
		if ( preg_match('#[^0-9a-z]#',$v)  ){
			return false;
		}
		return $this -> set_where( $this -> alias.'.u_act_code',$v);
	}
	
	
	public function where_like_login($v){
		if ( false!==users::error_login($v) ){
			return FALSE;
		}
		return $this -> set_anothe_where( $this -> alias.'.u_login LIKE "'.$v.'%"');
	}
	
	
	public function where_email($l){
		$e = users::error_email($l);
		if ( $e ){
			return false;
		}
		return $this -> set_where( $this -> alias.'.u_email',$l);
	}
	
	public function where_active($v){
		$v = intval($v);
		return $this -> set_where( $this -> alias.'.u_active',$v);
	}
	public function where_group($v){
		$v = intval($v);
		return $this -> set_where( $this -> alias.'.g_id',$v);
	}
	
	public function where_ban_end($v){
	global $MAIN_DB;
		$v = intval($v);
		$a =  $this -> get_alias( $MAIN_DB-> prefix("users_ban") );
		return $this -> set_anothe_where( $a.'.b_time_end <= '.$v);
	}
	
	
	public function orderby_id($v){
		return 	$this -> set_orderby($this -> alias.'.u_id',$v);
	}
	public function orderby_login($v){
		return 	$this -> set_orderby($this -> alias.'.u_login',$v);
	}

	static function profile_url($v){
		return sys_url(URL_USERS_PROFILE,$v);
	}
	
		//	логин на входе
	protected function url_user_comments($v){
		include_once(MAIN_SOURCE_PATH.'/modules/admin/inc/url.php');
		return sys_url(URL_ADMIN_COMMENTS_FILTER_URL,false,false,false,$v,false);

	}
	
	static function avatar_src($v){
		if ( empty($v) ){
	    return false;
	  }
		return '/media/users/ava/'.$v;
	}
	
	

	
	protected function forget_url($v,$row){
    return MAIN_URL.'/?p_name=users_profile&act=forget_end&code='.$v.'&id='.$row['u_id'];
	}
	
	
		//	на основе количества очков, считаем ранг
	protected function rank_img($v){
	global $MAIN_PAGE,$MAIN_DB;
		/*
			//	рефакторинг
		$MAIN_DB -> set_prefix('lc');
			//	----
			
			//	получаем изображение
		$ranks = $MAIN_PAGE -> cache( $MAIN_DB -> prefix('users_rank') );
		foreach( $ranks as $r ){
			 if ( $v>=$r['r_points']){
				$r_image = $r['r_image'];
				continue;
			  }
		}
		
			//	у ранга всегда должно быть изображение
		if ( !empty($r_image) ){
		  	return MAIN_RF_URL.'/source/modules/ajax/tmp/'.$r_image;
		}else{
			sys_error(500);
		}*/
	}
	
	protected function rank_name($v){
		/*if ( !empty($v) ){
		  	return '/source/modules/ajax/tmp/crop_'.$v;
		}else{
		  return '/source/tmpl/img/no_cover.jpg';
		}*/
	}
	 
   /*function get_rank_img($points){
    global $rank;
	$points = intval($points);
    $tmp = array();
    foreach( $rank AS $array ){
	 
	}
	return $tmp[sizeof($tmp)-1]['r_image'];
  }*/
  
  protected function user_type($v){
  	if ($v==1){
  		return U_USERS_MEMBER_TYPE;
  	}elseif( $v==2 ){
  		return U_USERS_ORG_TYPE;
  	}else{
  		sys_error(500);
  	}
  }
  
   protected function u_time_reg($v){
   		return date('d.m.Y',$v);
   }
   
	protected function row_class($v){
		return !empty($v) ? 'body2' : 'body_red';
	}
	
	
	protected function unconfirm($v){
		return ($v==0) ? true : false;
	}
	protected function confirm($v){
		return ($v==1) ? true : false;
	}
	
	protected function delete($v){
		return ($v==2) ? true : false;
	}
	
	protected function banned($v){
		return ($v==3) ? true : false;
	}
	
	
	
	protected function ban_time_end($v){
		if (empty($v) ){
			return false;
		}
		return date('d.m.Y',$v);
	}
	
	protected function ban_time_add($v){
		if (empty($v) ){
			$v = MAIN_TIME;
		}
		return date('d.m.Y',$v);
	}
}	
	
	
class users{

	private $info = array();
	private $last_error = false;
	private $debug = false;
	//private $main_key = false;
	private $set_info = array();
	
	public function __construct( $array=array() ){
		$this -> info = $array;
		//$this -> main_key = $array['u_id'];
	}
	
		//	обновление сессии пользователя
	public function  user_session($save){
	global $MAIN_PAGE;
		if ( false===$this -> id()){
			return false;
		}
		$s_data = serialize(array(
			users::make_pass($this -> pass()),
			$this -> id(),
			(!empty($save) ? 1 : 0)
		));
		
		if ( $save){
		  $time_live_cookie = MAIN_TIME+60*60*24*30;
		}else{
		   $time_live_cookie = 0;
		}
		setcookie($MAIN_PAGE -> config('sys_cookie_name'), $s_data, $time_live_cookie, '/', '', 0);
	}
	
	/***
		set,get - это общие функции доступа к свойствам объекта пользователя. 
					Использовать лучше только внутри модуля users
	***/
	public function get($k){
		if ( isset($this -> info[$k]) ){
			return $this -> info[$k];
		} 
		sys_error( '500', sprintf(U_EMPTY_VAR,$k) );
	}
	
	public function set($k,$v){
	
		if ( method_exists($this,'set_'.$k) ){
			 $f = 'set_'.$k;
			return $this -> $f($v);
		}else{
			$this -> set_info[$k] = $v;
			return TRUE;
		}
	}
	
	
		/***	
			SET - функции. Это уникальные обработчики для значений заносимых в базу данных
		***/
		
	public function set_u_login($v){	
		$e = users::error_login($v);
		if ( !empty($e) ){
		  throw new Exception($e);
		}
		if ( $this -> id()==0 && users::exists_login($v,$this -> id() ) ){
			throw new Exception(U_EXISTS_LOGIN);
		}
		$this -> set_info['u_login']=$v;
		return TRUE;
	}
	
	
	
	public function set_u_spam($v){	
	  $v = !empty($v) ? 1 : 0;
	  $this -> set_info['u_spam']=$v;
	  return TRUE;
	}
	public function set_u_pass($v){	
		if ( empty($v) && $this -> id()!=0 ){
			return false;
		}
		$e = users::error_pass($v);
		if ( !empty($e) ){
		  throw new Exception($e);
			//$this -> make_error($e);
			//return FALSE;
		}
		$this -> set_info['u_pass']=users::make_pass($v);
		return TRUE;
	}
	
	public function set_u_pass_re($v){	
		if ( empty($this -> set_info['u_pass']) && empty($v) && $this -> id()!=0 ){
			return false;
		}
		
				
		if ( $this -> set_info['u_pass']!=users::make_pass($v) ){
		  throw new Exception(U_BAD_PASS_RE);
			//$this -> make_error(U_BAD_PASS_RE);
			//return FALSE;
		}
		return TRUE;
	}
	
	public function set_u_email($v){
			
		$e = users::error_email($v);
		if ( !empty($e) ){
		  throw new Exception($e);
			//$this -> make_error($e);
			//return FALSE;
		}
		
		if ( $this -> email()==0 && users::exists_email($v,$this -> id() ) ){
		  throw new Exception(U_EXISTS_EMAIL);
			//$this -> make_error(U_EXISTS_EMAIL);
			//return FALSE;
		}
		
		$this -> set_info['u_email']=$v;
		return TRUE;
	}
	public function set_u_name($v){	
		if ( empty($v) ){
		  throw new Exception(U_ERROR_EMPTY_NAME);
			//$this -> make_error(U_ERROR_EMPTY_NAME);
			//return FALSE;
		}
		$this -> set_info['u_name']=$v;
		return TRUE;
	}
	
	public function set_u_dob($v){	
		if ( empty($v) ){
			return false;
		}
		if ( !preg_match('#^[0-9]{4,4}-[0-9]{1,2}-[0-9]{1,2}$#iUs',$v) ){
		  throw new Exception(U_ERROR_FALSE_DOB);
			//$this -> make_error(U_ERROR_FALSE_DOB);
			//return false;
		}
		$this -> set_info['u_dob']=$v;
		return true;
	}
	
	
	public function set_g_type($v){
		
		$array = array('admin','user','guest');
		if ( !in_array($v,$array) ){
			sys_error( '500');
		}
		$this -> set_info['g_type']=$v;
		return TRUE;
	}
	public function set_g_id($v){
		$v = intval($v);
		if ( empty($v) ){
		  throw new Exception(U_ERROR_FALSE_GROUP);
			//$this -> make_error(U_ERROR_FALSE_GROUP);
			//return false;
		}
		$this -> set_info['g_id']=$v;
		return TRUE;
	}
	
	public function set_g_name($v){
		if ( empty($v) ){
			sys_error( '500');
		}
		$this -> set_info['g_name']=$v;
		return TRUE;
	}
	
	public function set_u_points($v){
		$v = intval($v);
		if ( empty($v) ){
			return false;
		}
		if ( $v>=0){
			$this -> set_info['u_points']=$v;
			return TRUE;
		}
		throw new Exception(U_ERROR_FALSE_POINTS);
	
	}
	
	public function set_active($v){
		
		$v =  !empty($v) ? '1' : 0;
		$this -> set_info['u_active']=$v;
		return TRUE;
	}
	public function set_delete($v){
		if ( $v ==2 ){
			$this -> set_info['u_active']=2;
			return TRUE;
		}
		return false;	
	}
	public function set_u_avatar($v){
		
		if ( empty($v) ){
		  $this -> set_info['u_avatar']=$v;
			return TRUE;
		}
	
		if ( !preg_match('#^([x_0-9]*)\.jpg|jpeg|gif|png$#iUs',$v) ){
			return false;
		}
		$this -> set_info['u_avatar']=$v;
		return TRUE;
	}
	
		/***
			GET	- функции-алисы,их нужно использовать вне класса и модуля, чтобы снизить процент изменяющегося кода
					при переходе от одного проекта к другому
		***/
	public function active(){
		return $this -> info['u_active'];
	}
	public function id(){
		return $this -> info['u_id'];
	}
	

	public function lang(){
		if ( empty($_COOKIE['lang']) ){ 
			return $this -> info['u_lang'];
		}elseif( sys_check_lang($_COOKIE['lang']) ){
			return $_COOKIE['lang'];
		}else{
			return MAIN_LANG;
		}
	}
	
	public function group(){
		return $this -> info['g_id'];
	}
	public function login(){
		return $this -> info['u_login'];
	}
	public function email(){
		return $this -> info['u_email'];
	}
	public function name(){
		return $this -> info['u_name'];
	}
	public function act_code(){
		return $this -> info['u_act_code'];
	}
	public function pass(){
		return $this -> info['u_pass'];
	}
	public function count_posts(){
		return $this -> info['u_count_posts'];
	}
	public function count_blog_posts(){
		return $this -> info['u_count_blog_posts'];
	}
	
	public function points(){
		return $this -> info['u_points'];
	}
	
	public function avatar(){
		return $this -> info['u_avatar'];
	}
	public function avatar_src(){
	  if ( empty($this -> info['u_avatar']) ){
	    return false;
	  }
		return '/media/users/ava/'.$this -> info['u_avatar'];
	}
	

	
		/***
			проверка прав пользователей на дуступ к страницам и блокам
		***/
	public function check_right_page($f_id){
	global $MAIN_DB;
		$f_id = intval($f_id);
		if ( empty($f_id) ){
		sys_error( '500');
		}
		$sql = "
			SELECT COUNT(*) 
			FROM ".MAIN_GRP_PAGES_LINK_TBL." 
			WHERE f_id='$f_id' AND g_id='".$this -> group()."'";
		list($count) = $MAIN_DB -> fetch_array( $MAIN_DB -> query($sql) );
		if ( $count>0 ){
			return TRUE ;
		}
		return FALSE;
	}
	
	public function check_right_block($b_id){
	global $MAIN_DB;
		$b_id = intval($b_id);
		if ( empty($b_id) ){
			sys_error(ERROR_500);
		}

		$sql = "
			SELECT 
				COUNT(*)

			FROM 
				".MAIN_GRP_BLK_LINK_TBL."
			WHERE 
				b_id = '$b_id' AND
				g_id ='".$this -> group()."'";
		list( $access ) = $MAIN_DB -> fetch_array( $MAIN_DB-> query($sql) );
		if ( $access>0 ){
			return TRUE;
		}
		return FALSE;
	}
	
	public function is_admin(){
		if ( $this -> get('g_type')=='admin' ){
			return TRUE;
		}else{
			return FALSE;
		}

	}
	
	public function is_user(){
		if ( $this -> get('g_type')=='user' ){
			return TRUE;
		}else{
			return FALSE;
		}
	}
	
	public function is_ban(){
		if ( $this -> get('u_ban')==1 ){
			return TRUE;
		}else{
			return FALSE;
		}
	}
	
 	public function error(){
  		return $this -> last_error;
	}
	
		//	добавляем в таблицу новую запись
	public function insert(){
	global $MAIN_DB;
			//	при инициализации значений произошла ошибка
		if ( false!==$this -> error() ){
			return false;
		}
		if ( sizeof($this -> set_info)==0 ){
			sys_error( '500',U_ARRAY_EMPTY);
		}
			//	так как запись новая, нужно проверить уникальные ключи на повторение
		/*if ( users::exists_login($this -> info['u_login']) ){
			$this -> make_error(ERROR_MESSAGE,U_EXISTS_LOGIN);
			return false;
		} */
	/*	if ( users::exists_email($this -> info['u_email']) ){
			$this -> make_error(ERROR_MESSAGE,U_EXISTS_EMAIL);
			return false;
		} */
			//	формируем и выполняем запрос
		$sql = array();
		foreach( $this -> set_info as $k=>$v ){
			$sql[]="`$k`='".sys_in_sql($v)."'";
		}
		$sql = "INSERT INTO ".$MAIN_DB -> prefix("users")." SET ".implode(',',$sql)."";
		if ( !empty($this -> debug ) ){
			die($sql);
		}
		
		$MAIN_DB -> query($sql);
		foreach( $this -> set_info as $k=>$v ){
			$this -> info[$k]=$v;
		}
		$id = $MAIN_DB -> insert_id();
		$this -> info['u_id']=$id;
		return $id;
	}
	
	
	public function update(){
	global $MAIN_DB;
		
		/*if ( empty($id) ){
			$this -> make_error(ERROR_MESSAGE,U_ARRAY_EMPTY);
			return false;
		}*/
			//	при инициализации значений произошла ошибка
		if ( false!==$this -> error() ){
			return false;
		}
		if ( sizeof($this -> set_info)==0 ){
			sys_error( '500',U_ARRAY_EMPTY);
		}
		$sql = array();
		foreach( $this -> set_info as $k=>$v ){
			$sql[]="`$k`='".sys_in_sql($v)."'";
		}
		$sql = "UPDATE  ".$MAIN_DB -> prefix("users")." SET ".implode(',',$sql)." WHERE u_id='".$this -> id()."'";
		if ( !empty($this -> debug ) ){
			die($sql);
		}
		$MAIN_DB -> query($sql);
		foreach( $this -> set_info as $k=>$v ){
			$this -> info[$k]=$v;
		}
		return $this -> id();
	}
	
	public function set_debug($f){
		$this -> debug = $f;
	}
	
	/****
	*	удаление пользователей из системы
	*	@project Poremontu
	*
	*
	****/
	public function delete( ){
	global $MAIN_DB;
		$id = $this -> id();
		if ( empty($id) ){
			sys_error(ERROR_500,E_EMPTY_ID);
		}
		//$sql = "DELETE FROM ".MAIN_USERS_TBL." WHERE u_id='$id'";
		//$MAIN_DB -> query($sql);
		
		//$sql = "DELETE FROM ".$MAIN_DB -> prefix("users_points_log")." WHERE u_id='$id'";
		//$MAIN_DB -> query($sql);
		
		$sql = "DELETE FROM ".$MAIN_DB -> prefix("users")." WHERE u_id='$id'";
		$MAIN_DB -> query($sql);
		
	
		
		return TRUE;
	}
	
	
	public function undelete( ){
	global $MAIN_DB;
		$id = $this -> id();
		if ( empty($id) ){
			sys_error(ERROR_500,E_EMPTY_ID);
		}
		//$sql = "DELETE FROM ".MAIN_USERS_TBL." WHERE u_id='$id'";
		//$MAIN_DB -> query($sql);
		
		//$sql = "DELETE FROM ".$MAIN_DB -> prefix("users_points_log")." WHERE u_id='$id'";
		//$MAIN_DB -> query($sql);
		
		//$sql = "DELETE FROM ".$MAIN_DB -> prefix("users_ban")." WHERE u_id='$id'";
		//$MAIN_DB -> query($sql);
		
			//	пользователь восстановлен
		$this -> set('u_active',1);
		$this -> update();
		
		return TRUE;
	}
	
	/****
	*	бан пользователя
	*	@project Poremontu
	*
	*
	****/
	public function banned($time_begin,$time_end,$reason=''){
	global $MAIN_DB;
		
		$time_begin = explode('.',$time_begin);
		
		if (  sizeof($time_begin)!=3 ){
			$this -> make_error(M_USERS_FALSE_DATE_BEGIN);
			return false;
		}
		$time_begin = mktime(0,0,0,$time_begin[1],$time_begin[0],$time_begin[2]);
		
		
		$time_end =  explode('.',$time_end);
		
		if ( empty($time_end) || sizeof($time_end)!=3 ){
			$this -> make_error(M_USERS_FALSE_DATE_END);
			return false;
		}
		$time_end = mktime(0,0,0,$time_end[1],$time_end[0],$time_end[2]);
		
		
		$sql = "DELETE FROM ".$MAIN_DB -> prefix("users_ban")."  WHERE u_id='".$this -> id()."'";
		$MAIN_DB -> query($sql);
			
			
		$sql = "INSERT INTO ".$MAIN_DB -> prefix("users_ban")." SET

			u_id='".$this -> id()."',
			b_time_add = ".$time_begin.",
			b_time_end = ".$time_end.",
			b_reason= '".sys_in_sql($reason)."'";
		$MAIN_DB -> query($sql);
		
		$this -> set('u_active',3);
		if ( !$this -> update() ){
			return false;
		}
			//	извещение пользователя, что он забанен
		
		return true;	
	}
	
	/****
	*	удаляем бан пользователя
	*	@project Poremontu
	*
	*
	****/
	public function unbanned(){
	global $MAIN_DB;
		

		$sql = "DELETE FROM ".$MAIN_DB -> prefix("users_ban")."  WHERE u_id='".$this -> id()."'";
		$MAIN_DB -> query($sql);
			

		$this -> set('u_active',1);
		if ( !$this -> update() ){
			return false;
		}
			//	извещение пользователя, что он забанен
		
		return true;	
	}
	
		//	проверяет логин на соответствие формату, возвращает ошибку	или false
	static function error_login($l){
		
		if ( strlen($l)<3 || strlen($l)>20 ){
			return 'Ошибка: логин "'.($l).'" не соответствует разрешённому формату';
		}
		
		if ( preg_match('#[^.0-9-_a-z]#iUs',$l) ){
			return  'Ошибка: логин "'.$l.'" содержит запрещённые символы';
		}
		
		return false;
	}
	static function exists_login($l,$id=0){
	global $MAIN_DB;
		$u = new u_query('u');
		$u -> where_login($l);
		$u -> where_not_id($id);
		$u -> get('COUNT(*)');
		list($count) = $u -> row();
		if ( $count>0 ){
			return true;
		}
		return false;
	}
	static function error_pass($l){
		if ( strlen($l)<3 || strlen($l)>20 ){
			return U_ERROR_BAD_PASS;
		}
		return false;
	}
	
	static function error_email($l){
		if ( !sys_is_mail($l) ){
			return U_ERROR_BAD_EMAIL;
		}
		return false;
	}
	
	static function exists_email($v,$id=0){
	global $MAIN_DB;
		$u = new u_query('u');
		$u -> where_email($v);
		$u -> where_not_id($id);
		//$u -> set_debug(1);
		$u -> get('COUNT(*)');
		list($count) = $u -> row();
		if ( $count>0 ){
			return true;
		}
		return false;
	}
	
		//	создаём объект для гостя
	static function create_guest(){
	global $MAIN_PAGE;
		$row = array(
			'u_id' => false,
			'g_id' => 3,
			'g_type' => 'guest',
			'u_login' => $MAIN_PAGE -> config("sys_guest_name"),
			'u_lang' => 'ru'
		);
		$u = new users( $row );
		
		return $u;
	}
		//	создаём объект пользователя по переданному id
	static function load_id($id){
		$u = new u_query('u');
		$u -> include_groups('g','g.g_type,g.g_name');
		
		if ( !$u -> where_id($id) ){
			return FALSE;
		}
		if ( !$u -> get('u.*') ){
			return FALSE;
		}
		if (  $u -> get_count_rows()==0 ){
			return FALSE;
		}
		return new users( $u -> row() );
	}
			
	static function create(){
		return new users( array('u_id'=>0) );
	}
	
		//	создаём объект пользователя по переданному логину
	static function load_login($l){
			//	формируем запрос
		$u = new u_query('u');
			//	включаем в запрос информацию о группе пользователя 
		$u -> include_groups('g','g.g_type,g.g_name');
			//	логин задан неверно, такого в базе быть не может - это ясно и без запроса
		if ( !$u -> where_login($l) ){
			return FALSE;
		}
		$u -> get('u.*');
			//	запрос вернул нулевой результат, такого пользователя нет
		if (  $u -> get_count_rows()==0 ){
			return FALSE;
		}
			//	создаём объект и возвращаем ссылку
		return new users( $u -> row() );
	}
			//	создаём объект пользователя по переданному логину
	
	static function load_email($l){
			//	формируем запрос
		$u = new u_query('u');
			//	включаем в запрос информацию о группе пользователя 
		$u -> include_groups('g','g.g_type,g.g_name');
			//	логин задан неверно, такого в базе быть не может - это ясно и без запроса
		if ( !$u -> where_email($l) ){
			return FALSE;
		}
		$u -> get('u.*');
			//	запрос вернул нулевой результат, такого пользователя нет
		if (  $u -> get_count_rows()==0 ){
			return FALSE;
		}
			//	создаём объект и возвращаем ссылку
		return new users( $u -> row() );
	}
	
	/***
		авторизация
	***/
	static function auth(){
	global $MAIN_PAGE;
			// просто гость
		if ( empty($_COOKIE[ $MAIN_PAGE -> config('sys_cookie_name') ]) ){
			return users::create_guest();
		}
		$cookie = unserialize(stripslashes($_COOKIE[$MAIN_PAGE -> config('sys_cookie_name')]));
			//  кука имеет неправильный формат
		if ( !is_array($cookie) OR sizeof($cookie)<>3 ){
			return users::create_guest();
		}
		list($key,$u_id,$save) =  $cookie;
		$save = intval($save);
		if ( empty($u_id) || empty($key) ){
			return users::create_guest();
		}
		$u = users::load_id($u_id);
		if ( $u===FALSE || $key!=  users::make_pass( $u -> pass() ) ){
			return users::create_guest();
		}
		if ( $u -> active()!=1 ){
			return users::create_guest();
		}
		$u -> user_session($save);
		return $u;
	}
	
	static public function make_pass($pass){
		return md5($pass.MAIN_CLOSE_KEY);
	}
	
	static function logout(){
	global $MAIN_PAGE;
		setcookie($MAIN_PAGE -> config('sys_cookie_name'), false, 0, '/', '', 0);
		setcookie('is_admin', 0, $time_live_cookie, '/', '', 0);
		setcookie('u_id', 0, $time_live_cookie, '/', '', 0);
		setcookie('u_login', 0, $time_live_cookie, '/', '', 0);
	}
	
	static function groups(){
	global $MAIN_DB;
		$sql  = " SELECT g_id,g_name FROM ".MAIN_GROUP_TBL;
		$res = $MAIN_DB -> query($sql);
		$result = array();
		while( $row = $MAIN_DB -> fetch_array($res) ){
			$result[$row['g_id']] = $row['g_name'];
		}
		return $result;
	}
	
	private function make_error($msg){
 		$this -> last_error = $msg;		
	}
	
	static function control_points($uid,$type){
	global $MAIN_PAGE,$MAIN_DB;
		include_once(MAIN_SOURCE_PATH.'/modules/users/cache/points.php');
		include_once(MAIN_SOURCE_PATH.'/modules/users/inc/class.users.php');
		$points = $MAIN_PAGE -> config($type);
		
		
		$u = users::load_id($uid);
	
		if ( false===$u ){
			//sys_error(ERROR_500);
			return true;
		}
		$u -> set( 'u_points',  $points + $u -> points() );
   		$u -> update();

	  	$sql = "
	  		INSERT INTO ".$MAIN_DB -> prefix('users_points_log')." 
	  		SET `type`='".$type."' , u_id='".$uid."', time='".MAIN_TIME."', points='".$main_points[$type]."'";
	 	$MAIN_DB -> query($sql);
		return true;
	}
		//	удаляем просроченные баны
	static function clear_ban(){
	global $MAIN_DB;
		$u = new u_query('u');
		$u -> include_banned('b','b.u_id');
		$u -> where_ban_end( MAIN_TIME );
		//$u -> set_debug(1);
		$u -> get(false,false);
		while( list($u_id) = $u -> row() ){
			$user = users::load_id($u_id);
			$user -> set('u_active',1);
			$user -> update();
			$sql = "DELETE FROM ".$MAIN_DB -> prefix("users_ban")." WHERE u_id='$u_id'";
			$MAIN_DB -> query($sql);
		}
		return true;
	}

}	//	end class user 
?>
