<?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.'/inc/class.query.php');
include_once(MAIN_SOURCE_PATH.'/inc/class.objects.php');

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


class filedsSetUsers
{
  //static $id = false; //  адрес новости
  
  

  static function u_login($v,$obj){	
    
		$e = users::error_login($v);
		if ( !empty($e) ){
		  throw new Exception($e);
		}
		
		if (  users::exists_login($v,$obj -> id() ) ){
			throw new Exception(U_EXISTS_LOGIN);
		}
		return $v;
	}
	
	static function u_pass($v,$obj){	
	    //  пароль не меняется
		if ( empty($v) && $obj -> id()!=0 ){
			return false;
		}
		$e = users::error_pass($v);
		if ( !empty($e) ){
		  throw new Exception($e);
		}
		return users::make_pass($v);
	}
	
	static function u_pass_re($v,$obj){	
	
		if ( empty($obj -> set_info['u_pass']) && empty($v) && $obj -> id()!=0 ){
			return false;
		}
		
		if ( $obj -> set_info['u_pass']!=$v  ){
		  throw new Exception(U_BAD_PASS_RE);
		}
		return false;
	}
	
	static function u_email($v,$obj){
			
		$e = users::error_email($v);
		if ( !empty($e) ){
		  throw new Exception($e);
		}
		
		if (  users::exists_email($v,$obj -> id() ) ){
		  throw new Exception(U_EXISTS_EMAIL);
		}
		return $v;
	}
	public function u_name($v){	
		if ( empty($v) ){
		  throw new Exception(U_ERROR_EMPTY_NAME);
		}
		return $v;
	}
	
	public function 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);
		}
		return $v;
	}
	
	public function agree_rules($v){	
	
		if ( empty($v) ){
			throw new Exception('Ошибка: нельзя закончить регистрацию, не согласившись с правилами!');
		}
		
		return false;
	}
	
	public function captcha($v){	
	
		if ( false===captcha::check() ){
			throw new Exception('Ошибка: код с картинке введён неверно!');
		}
		
		return false;
	}
	
	/*
	public function g_type($v){
		$array = array('admin','user','guest');
		if ( !in_array($v,$array) ){
			sys_error( '500');
		}
		return $v;
	}*/
	
	public function g_id($v){
		$v = intval($v);
		if ( empty($v) ){
		  throw new Exception(U_ERROR_FALSE_GROUP);
		}
		return $v;
	}
	
	public function set_g_name($v){
		if ( empty($v) ){
			sys_error( '500');
		}
		return $v;
	}

	public function u_avatar($v){
		
		if ( empty($v) ){
		  return $v;
		}
	
		if ( !preg_match('#^([x_0-9]*)\.jpg|jpeg|gif|png$#iUs',$v) ){
			return false;
		}
		return $v;
	}

	
  
	static function u_active($v){

    return !empty($v) ? 1 : 0;
  }
	

 
  
}

class filedsGetUsers
{

  static $__var = array();  //  для хранения временных переменных
  
  static function u_active_checked($v){
    return !empty($v) ? 'checked' : '';
  }

  static function upl_img($v){
  global $MAIN_PAGE;
    $a = new upload_img('avatar');
		 $a -> set_max_size( 500000 );
		$a -> set_crop($MAIN_PAGE -> config('users_avatar_width'),$MAIN_PAGE -> config('users_avatar_height'));
	  $a -> set_file($v);
		$a -> set_path( 'users/ava');
		$a -> set_base( MAIN_URL.'/media/users/ava');
		return $a -> get('ava',1,'u_avatar');
  
  }
  
  static function groups_list($v){
   	$gl = new group_select_box();
   	return  $gl -> group_list( $v );
  }
  
  static function profile_url($v){
		return sys_url(URL_USERS_PROFILE,$v);
	}
	
		//	логин на входе
	static 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;
	}
	
	
	static function forget_url($v,$row){
    return MAIN_URL.'/?p_name=users_profile&act=forget_end&code='.$v.'&id='.$row['u_id'];
	}
  
  static function user_type($v){
  	if ($v==1){
  		return U_USERS_MEMBER_TYPE;
  	}elseif( $v==2 ){
  		return U_USERS_ORG_TYPE;
  	}else{
  		sys_error(500);
  	}
  }
  
  /*static function u_time_reg($v){
   		return date('d.m.Y',$v);
  }*/
  static function time_reg($v){
   		return date('d.m.Y',$v);
  }
  
  static function array_dob($v){
   		$v = explode('.',$v);
   		return array('year'=>$v[0],'month'=>$v[1],'day'=>$v[2]);
  }
  
  static function u_day($v){
   		$v = explode('-',$v);
   		return $v[2];
  }  
  
  static function u_month($v){
   		$v = explode('-',$v);
   		return $v[1];
  } 
   static function u_year($v){
   		$v = explode('-',$v);
   		return $v[0];
  } 
   

 
}



class usersQuery extends query{

	var $fields_get = 'filedsGetUsers';
	
  /**
  * @var string $alias Алиас для исплользования в mysql запросе
  */
  public function __construct($alias){
    $this -> set_table(MAIN_USERS_TBL );
    $this -> set_alias($alias);
  }
  
  public function include_groups($alias,$cols=''){
		$this -> include_table( MAIN_GROUP_TBL ,$alias,'g_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;
		}
		$a = $this -> get_alias(MAIN_USERS_TBL);
		return $this -> set_where( $a.'.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 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);
	}
	
	

 

}	//	end class metasQuery



class users extends objects{

  public $table = "users";
  public $key = "u_id";
	public $fields = 'filedsSetUsers';
 
 
  static function query($a){
    return new usersQuery($a);
  }
 		//	обновление сессии пользователя
	public function  user_session($save){
	global $MAIN_PAGE;
		if ( false===$this -> id()){
			return false;
		}
		$s_data = serialize(array(
			self::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);
	}
	
  
  
 
	public function id(){
		return $this -> u_id;
	}

	public function group(){
		return $this -> g_id;
	}
  public function pass(){
		return $this -> u_pass;
	}
	public function active(){
		return $this -> u_active;
	}
	public function login(){
		return $this -> u_login;
	}
	public function email(){
		return $this -> u_email;
	}
	public function name(){
		return $this -> u_name;
	}
	public function act_code(){
		return $this -> u_act_code;
	}
	

	public function avatar(){
		return $this -> u_avatar;
	}
	public function avatar_src(){
	  if ( empty($this -> u_avatar) ){
	    return false;
	  }
		return '/media/users/ava/'.$this -> u_avatar;
	}
  public function profile_url(){
		return sys_url(URL_USERS_PROFILE,$this -> login() );
	}
	public function lang(){
		if ( empty($_GET['lng_set']) ){ 
			return $this -> u_lang;
		}elseif( sys_check_lang($_GET['lng_set']) ){
			return $_GET['lng_set'];
		}else{
			return MAIN_LANG;
		}
	}
	
	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 -> g_id."'";
		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;
		}
	}


		
		


	
		//	проверяет логин на соответствие формату, возвращает ошибку	или false
	static function error_login($l){
		if ( strlen($l)<3 ){
		  return 'Ошибка: логин должен содержать не менее 3-х символов';
		}
		if (  strlen($l)>20 ){
			return 'Ошибка: логин должен содержать не более 20-ти символов';
		}
		
		if ( preg_match('#[^.0-9-_a-z]#iUs',$l) ){
			return  'Ошибка: логин "'.$l.'" содержит запрещённые символы';
		}
		
		return false;
	}
	
	static function exists_login($l,$id=0){
		$u = self::query('u');
		//$u -> set_debug(1);
		$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 = self::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 self( 0,$row );
		
		return $u;
	}
		//	создаём объект пользователя по переданному id
	static function load_id($id){
		$u = self::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 self( $id,$u -> row() );
	}
			
	static function create(){
		return new self( 0,array('u_id'=>0) );
	}
	
		//	создаём объект пользователя по переданному логину
	static function load_login($l){
		$u = self::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 self( $u->u_id,$u -> row() );
	}
			
			//	создаём объект пользователя по переданному логину
	static function load_email($l){
		$u = self::query('u');
		//$u -> set_debug(1);
		$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 self( $u->u_id,$u -> row() );
	}
	
	/***
		авторизация
	***/
	static function auth(){
	global $MAIN_PAGE;
			// просто гость
		if ( empty($_COOKIE[ $MAIN_PAGE -> config('sys_cookie_name') ]) ){
			return self::create_guest();
		}
		$cookie = unserialize(stripslashes($_COOKIE[$MAIN_PAGE -> config('sys_cookie_name')]));
			//  кука имеет неправильный формат
		if ( !is_array($cookie) OR sizeof($cookie)<>3 ){
			return self::create_guest();
		}
		list($key,$u_id,$save) =  $cookie;
		$save = intval($save);
		if ( empty($u_id) || empty($key) ){
			return self::create_guest();
		}
		$u = self::load_id($u_id);
		if ( $u===FALSE || $key!=  self::make_pass( $u -> pass() ) ){
			return self::create_guest();
		}
		if ( $u -> active()!=1 ){
			return self::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;
	}
	
	static function getGroup($u)
	{
	  if ( empty($u) )
	  {
      return 3;
    }
    return $u -> group();
	}
	
	static function getGroupType($u)
	{
	  $group_id = self::getGroup($u);
	  $array = array('1'=>'admin','6'=>'moderator','3'=>'guest','4'=>'user','5'=>'user');
    return $array[$group_id];
	}	
	


  	
  	
	
	
} //  end class



	
?>
