<?
	class User {

		var $DB;
		var $total = 0;
		var $user_admin_level   = 1;   // admin 의 권한 레벨을 1로 설정하였다 숫자가 낮을수록 높은 권한이다.
		var $user_withdrawal_level   = 10;   // 탈퇴 및 비회원 레벨
		var $user_basic_level   = 7;   // 회원가입시 할당할 기본 레벨을 설정한다.
		var $user_regular_level   = 5;   // 정회원 레벨을 설정한다.
		var $user_manager_level = 3; // 직원 레벨
		var $_LIST_NUM=20;

		# 생성자
		function User($db) {
			$this->DB = $db;
		}

		/*****
		 * 세션정보로서 관리자 권한을 가지고 있는지 확인 한다.
		 * "user_id" 세션값이 존재하고 "user_level" 세션값이 지정한 값보다 같거나 작은지 확인한다.
		 *****/
		function check_admin($info){
			return ($info['user_no'] != null && $info['user_id'] != null && $info['user_level'] <= $this->user_admin_level)? true:false;
		}
		 
		 /*****
		 * 세션정보로서 직원 권한을 가지고 있는지 확인 한다.
		 * "user_id" 세션값이 존재하고 "user_level" 세션값이 지정한 값보다 같거나 작은지 확인한다.
		 *****/
		function check_staff($info){
			return ($info['user_no'] != null && $info['user_id'] != null && $info['user_level'] <= $this->user_manager_level)? true:false;
		}

		/*****
		 * 세션정보로서 정회원 권한을 가지고 있는지 확인 한다.
		 * "user_id" 세션값이 존재하고 "user_level" 세션값이 지정한 값보다 같거나 작은지 확인한다.
		 *****/
		function check_regular($info){
			return ($info['user_no'] != null && $info['user_id'] != null && $info['user_level'] <= $this->user_regular_level)? true:false;
		}

		/*****
		 * 세션정보로서 로그인 상태인지 확인 한다.
		 * "user_id" 세션값이 존재하고 "user_level" 세션값이 지정한 값보다 작은지 확인한다.
		 *****/
		function check_login($info){
			return ($info['user_no'] != null && $info['user_id'] != null && $info['user_level'] <= $this->user_basic_level)? true:false;
		}

		/*****
		 * 아이디 중복체크
		 * 기본 검사는 javascript 와 php 에서 동시에 처리할 수 도 있으니 기본 검사 방법이 변경이 된다면 두군대를 수정하여야 한다.
		 *****/
		function check_dupleid($str){
			// Rule - 아이디는 4~10 자리 이며 첫자리에는 숫자가 올수없고 영숫자 조합이고 소문자만 사용한다.
			//if(ereg('^[a-z]{1}[a-z0-9]{3,11}$', $str)){
			//if(preg_match(_REGEXP, $str)){
				if($this->DB->getOne("select count(*) from ".TABLE_USER." where user_id = '{$str}'") > 0){ // 중복 아이디일 경우
					return array("code" => "D","user_id" => $str);
				}else{ // 중복 아이디가 아닐경우
					return array("code" => "A","user_id" => $str);
				}
			//}else{ // 형식에 맞지 않을경우
			//	return array("code" => "F","user_id" => "");
			//}
		}

		/*****
		 * 입력정보를 통해 회원 여부를 확인한다.
		 *****/
		function check_login_info($argu){
			$pwd1=substr(md5($argu["user_pwd"]),0,20);
			$pwd2=substr(md5($argu["user_pwd"]),-20);

			$pwd=$pwd1.$pwd2;
			
			$query = "
				select
					u.user_no,
					u.user_id,
					u.user_name,
					u.user_level,
					u.user_withdrawal
				from
					".TABLE_USER." u
				where
					u.user_id      = /* 1 */ ?
					and u.user_pwd = /* 2 */ ?
			";
			
			$row = $this->DB->getRow($query,array( /* 1 */ $argu['user_id'], /* 2 */ $pwd),DB_FETCHMODE_ASSOC);

			if (DB::isError($row)) {
				debug($row);exit;
				return;
			}else{
				return $row;
			}
		}
			
		/*****
		 * 세션에 저장된 상태를 반환한다.
		 *****/
		function get_status(){
			return array_filter(array(
				'user_no'       => $_SESSION['user_no'],
				'user_id'       => $_SESSION['user_id'],
				'user_name'     => $_SESSION['user_name'],
				'user_level'    => $_SESSION['user_level']
			),'delete_null_array');

		}

		/*****
		 * 회원 내용을 반환한다.
		 *****/
		function get_user_view($user_no){
			$query = "
				select
					*
				from
					".TABLE_USER."
				where
					user_no = '{$user_no}'
				";
			$res = $this->DB->query($query);
			if (DB::isError($res)) {
				debug($res);
				return;
			}

			$row = $res->fetchRow(DB_FETCHMODE_ASSOC);

			return $row;
		}

		function get_total(){
			$query = "select found_rows()";
			$total = $this->DB->getOne($query);

			if (DB::isError($total)) {
				die($total->getMessage());
			}
			return $total;
		}

		/*****
		 * 로그인 상태가 될수 있도록 세션을 생성한다.
		 *****/
		function set_login_session($data){
			$_SESSION['user_no']       = $data['user_no'];
			$_SESSION['user_id']       = $data['user_id'];
			$_SESSION['user_name']     = $data['user_name'];
			$_SESSION['user_level']    = $data['user_level'];
		}
		 
		 /*****
		 * 로그인 정보를 업데이트한다.
		 *****/
		function set_login_update($data){
			$query="
				update 
					".TABLE_USER."
				set
					user_cnt=user_cnt+1,
					user_lastlogin=now()
				where
					user_no='".$data['user_no']."'";

			$result = $this->DB->query($query);

			if (DB::isError($result)) {
				//debug($this->DB);
				die($result->getMessage());
			}
		}

		/*****
		 * 회원을 등록한다.
		 *****/
		function set_user_insert($argu){

			global $_adminpage;
			global $_lan_alert;

			// 변수 설정
			$argu["user_hp"]=$argu["user_hp1"]."-".$argu["user_hp2"]."-".$argu["user_hp3"];
			$argu["user_level"]=($_adminpage) ? $argu["user_level"] : $this->user_basic_level;
			$argu["user_id"]=($_adminpage) ? $argu["user_id"] : $argu["user_email"];

			$argu['return_url'] = ($argu['return_url']) ? urldecode($argu['return_url']) : "";

			// 아이디 중복 체크
			$id_chk=$this->check_dupleid($argu["user_id"]);

			if($id_chk['code'] == "D"){
				go_url("","이미 가입된 아이디입니다.");
				exit;
			}else{

				/// 빠진 사항 체크
				if(strlen($argu["user_id"])<4){ go_url("","아이디를 입력하지 않으셨거나 형식에 맞지 않습니다."); exit; }
				if(strlen($argu["user_pwd"])<4){ go_url("","비밀번호를 입력하지 않으셨거나 형식에 맞지 않습니다."); exit; }
				if(strlen($argu["user_name"])<2){ go_url("","성명이 입력되지 않았습니다."); exit; }
				
				$data = array(
					"user_id"         => $argu["user_id"],
					"user_name"         => $argu["user_name"],
					"user_hp"         => $argu["user_hp"],
					"user_email"      => $argu["user_email"],
					"user_emaillist"      => $argu["user_emaillist"],
					"user_level"        => $argu["user_level"],
					"user_memo"      => $argu["user_memo"],
					"user_withdrawal"   => "N",
					"user_withdrawal_date"       => null,
					"user_withdrawal_case"      => null,
					"user_withdrawal_memo"      => null,
					"user_ip"       => $_SERVER["REMOTE_ADDR"],
					"user_regdate"          => _NowTime,
					"user_cnt"          => 0,
					"user_lastlogin"          => null,
				);

				// 패스워드 암호화
				if(strlen($argu["user_pwd"])>3){
					$pwd1=substr(md5($argu["user_pwd"]),0,20);
					$pwd2=substr(md5($argu["user_pwd"]),-20);

					$pwd=$pwd1.$pwd2;
				}

				$data = array_merge($data, array("user_pwd" => $pwd));

				$sth = $this->DB->autoPrepare(TABLE_USER, array_keys($data), DB_AUTOQUERY_INSERT);
				$res = $this->DB->execute($sth, array_values($data));

				if (DB::isError($res)) {
					go_url("","회원 등록이 되지 않았습니다.\\n[".$res->getMessage()."]");
					exit;
				}
			}

			return $argu['return_url'];
		}

		/*****
		 * 회원 리스트를 반환한다.
		 *****/
		function get_user_list($argu,&$total,$limit = true){
			
			/// 검색 쿼리
			$addwhere = "(1=1)";
			if(strlen($argu['keyword']>0)){ $addwhere .= " and {$argu['s_type']} like '%{$argu['keyword']}%' "; }

			$query = "
				select
					count(*)
				from
					".TABLE_USER."
				where
					$addwhere
			";

			$total = $this->DB->getOne($query);
			if (DB::isError($list)) {
				die($list->getMessage());
			}

			$query = "
				select
					*
				from
					".TABLE_USER."
				where
					$addwhere
				order by
					user_regdate desc ";
			if($limit)
			$query .= "
				limit ".($argu['p']-1)*$this->_LIST_NUM.",".$this->_LIST_NUM;

			$list =& $this->DB->getAll($query, array(), DB_FETCHMODE_ASSOC);

			if (DB::isError($list)) {
				//debug($this->DB);
				die($list->getMessage());
			}

			return $list;
		}

		/*****
		 * 회원 내용을 Update 한다.
		 * 회원 탈퇴도 Level 만 탈퇴 등급으로 조정하는것으로 처리 하므로 Update Function 에서 처리한다.
		 *****/
		function set_user_update($argu){

			global $_adminpage;
			 
			if($argu["mode"]=="DELETE_ACTION"){
				if($_SESSION['user_level']==1){
					$argu["user_withdrawal_case"]="관리자 탈퇴 처리";
					$argu["user_withdrawal_memo"]="관리자 탈퇴 처리";
				}

				$data = array(
					"user_level"       => $this->user_withdrawal_level,	
					"user_withdrawal"       => "Y",
					"user_withdrawal_date"       => _NowTime,
					"user_withdrawal_case"      => $argu["user_withdrawal_case"],
					"user_withdrawal_memo"      => $argu["user_withdrawal_memo"]
				);
			}else{

				// 변수 설정
				$argu["user_hp"]=$argu["user_hp1"]."-".$argu["user_hp2"]."-".$argu["user_hp3"];

				$argu["user_level"]=($_adminpage) ? $argu["user_level"] : $this->user_basic_level;

				$data =  array(
					"user_name"         => $argu["user_name"],
					"user_hp"         => $argu["user_hp"],
					"user_email"      => $argu["user_email"],
					"user_emaillist"      => $argu["user_emaillist"],
				);

				if($_adminpage){
					$data=array_merge($data, array(
						"user_level" => $argu["user_level"],
						"user_memo"      => $argu["user_memo"]
					));

					if($argu["user_level"]<$this->user_withdrawal_level){
						$data=array_merge($data, array(
							"user_withdrawal"       => "N",
							"user_withdrawal_date"       => null,
							"user_withdrawal_case"      => null,
							"user_withdrawal_memo"      => null
						));
					}
				}

				// 비밀번호를 입력할 경우 비밀번호를 같이 변경한다.
				if(strlen($argu["user_pwd"])>3){
					$pwd1=substr(md5($argu["user_pwd"]),0,20);
					$pwd2=substr(md5($argu["user_pwd"]),-20);

					$pwd=$pwd1.$pwd2;

					$data=array_merge($data, array(
						"user_pwd" => $pwd
					));
				}
			}

			$result = $this->DB->autoExecute(TABLE_USER, $data, DB_AUTOQUERY_UPDATE, "user_no = '{$argu['user_no']}' ");

			if (DB::isError($result)) {
				//debug($this->DB);
				die($result->getMessage());
			}

			return true;
		}		
		
		function check_login_du($argu){
			$pwd1=substr(md5($argu["du_pwd"]),0,20);
			$pwd2=substr(md5($argu["du_pwd"]),-20);

			$pwd=$pwd1.$pwd2;
			
			$query = "
				select
					u.du_no,
					u.du_email,
					u.du_name,
					u.du_app
				from
					".TABLE_DU_USER." u
				where
					u.du_email      = '".$argu['du_email']."'
					and u.du_pwd = '".$pwd."'
			";

			$row = $this->DB->getRow($query,array(),DB_FETCHMODE_ASSOC);

			if (DB::isError($row)) {
				debug($row);exit;
				return;
			}else{
				return $row;
			}
		}
		
		
		function check_dupleid_du($str){
			if($this->DB->getOne("select count(*) from ".TABLE_DU_USER." where du_email = '{$str}'") > 0){ // 중복 아이디일 경우
				return array("code" => "D","du_email" => $str);
			}else{ // 중복 아이디가 아닐경우
				return array("code" => "A","du_email" => $str);
			}
		}

		function set_login_session_du($data){
			$_SESSION['duser_no']       = $data['du_no'];
			$_SESSION['duser_id']       = $data['du_email'];
			$_SESSION['duser_name']     = $data['du_name'];
			//$_SESSION['du_app']    = $data['du_app'];
		}
		

		/*****
		 * 세션에 저장된 상태를 반환한다.
		 *****/
		function get_status_du(){
			return array_filter(array(
				'duser_no'       => $_SESSION['duser_no'],
				'duser_id'       => $_SESSION['duser_id'],
				'duser_name'     => $_SESSION['duser_name'],
			),'delete_null_array');

		}
		
		
		function set_du_user_insert($argu){
		
			// 아이디 중복 체크
			$du_id_chk=$this->check_dupleid_du($argu["du_email"]);

			if($du_id_chk['code'] == "D"){
				go_url("","This email is already subscribed.");
				exit;
			}else{
				
				$data = array(
					"du_name"         => $argu["du_name"],
					"du_company"         => $argu["du_company"],
					"du_email"         => $argu["du_email"],
					"du_region"      => $argu["du_region"],
					"du_phone_num"      => $argu["du_phone_num"],
					"du_app"        => 'N',
					"du_regdate"      => _NowTime,
				);

				// 패스워드 암호화
				if(strlen($argu["du_pwd"])>3){
					$pwd1=substr(md5($argu["du_pwd"]),0,20);
					$pwd2=substr(md5($argu["du_pwd"]),-20);

					$pwd=$pwd1.$pwd2;
				}

				$data = array_merge($data, array("du_pwd" => $pwd));

				$sth = $this->DB->autoPrepare(TABLE_DU_USER, array_keys($data), DB_AUTOQUERY_INSERT);
				$res = $this->DB->execute($sth, array_values($data));

				if (DB::isError($res)) {
					go_url("","Has not been registered.\\n[".$res->getMessage()."]");
					exit;
				}
			}

			return true;
		
		}

		function set_du_user_update($argu){
			
			$data = array(
				"du_name"         => $argu["du_name"],
				"du_company"         => $argu["du_company"],
				"du_region"      => $argu["du_region"],
				"du_phone_num"      => $argu["du_phone_num"],
				"du_app"        => $argu["du_app"],
			);


			// 비밀번호를 입력할 경우 비밀번호를 같이 변경한다.
			if(strlen($argu["du_pwd"])>3){
				$pwd1=substr(md5($argu["du_pwd"]),0,20);
				$pwd2=substr(md5($argu["du_pwd"]),-20);

				$pwd=$pwd1.$pwd2;

				$data=array_merge($data, array(
					"du_pwd" => $pwd
				));
			}

			$result = $this->DB->autoExecute(TABLE_DU_USER, $data, DB_AUTOQUERY_UPDATE, "du_no = '{$argu['du_no']}' ");

			if (DB::isError($result)) {
				//debug($this->DB);
				die($result->getMessage());
			}

			return true;
		
		}


		function set_du_userpwd_update($argu){
			
			// 패스워드 암호화
			if(strlen($argu["new_pwd"])>3){
				$pwd1=substr(md5($argu["new_pwd"]),0,20);
				$pwd2=substr(md5($argu["new_pwd"]),-20);

				$pwd=$pwd1.$pwd2;
			}

			$data = array(
				"du_pwd"         => $pwd,
			);

			$result = $this->DB->autoExecute(TABLE_DU_USER, $data, DB_AUTOQUERY_UPDATE, "du_no = '{$argu['du_no']}' ");

			if (DB::isError($result)) {
				//debug($this->DB);
				die($result->getMessage());
			}

			return true;
		
		}



		function set_du_user_delete($du_no){
			$query = "DELETE FROM ".TABLE_DU_USER." WHERE du_no = '".$du_no."'";

			$res = $this->DB->query($query);
			if (DB::isError($res)) {
			    go_url("", $res->getMessage());
			    exit;
			}

			return true;

		}

		function get_du_user_list($argu,&$total,$limit = true){
			/// 검색 쿼리
			$addwhere = "(1=1)";
			if(strlen($argu['keyword']>0)){ $addwhere .= " and {$argu['s_type']} like '%{$argu['keyword']}%' "; }
		
			$query = "
				select
					count(*)
				from
					".TABLE_DU_USER."
				where
					$addwhere
			";

			$total = $this->DB->getOne($query);
			if (DB::isError($list)) {
				die($list->getMessage());
			}

			$query = "
				select
					*
				from
					".TABLE_DU_USER."
				where
					$addwhere
				order by
					du_regdate desc ";
			if($limit)
			$query .= "
				limit ".($argu['p']-1)*$this->_LIST_NUM.",".$this->_LIST_NUM;

			$list =& $this->DB->getAll($query, array(), DB_FETCHMODE_ASSOC);

			if (DB::isError($list)) {
				//debug($this->DB);
				die($list->getMessage());
			}

			return $list;
		
		}

		function get_du_user_view($du_no){
			$query = "
				select
					*
				from
					".TABLE_DU_USER."
				where
					du_no = '{$du_no}'
				";
			$res = $this->DB->query($query);
			if (DB::isError($res)) {
				debug($res);
				return;
			}

			$row = $res->fetchRow(DB_FETCHMODE_ASSOC);

			return $row;
		}

		function get_du_id_search($argu){
				// 주민/사업자 등록 번호 암호화
			
				$addwhere = "(du_email = '{$argu['du_email']}') ";

				$query = "
					select
						*
					from
						".TABLE_DU_USER."
					where
						$addwhere
					";

				$row = $this->DB->getRow($query,DB_FETCHMODE_ASSOC);
				if (DB::isError($row)) {
					//debug($row);
					die($row->getMessage());
					exit;
				}

				return $row;

		}

		function get_admlog_list($argu,&$total,$limit = true){
			global $_DB;
			
			$addwhere = " where (1=1) ";

			/// 검색쿼리
			if($argu['Search']){$addwhere .= " and (view like '%{$argu['Search']}%' or history like '%{$argu['Search']}%') ";	}
			if($argu['s_date'] && $argu['e_date']){$addwhere .= " and (regdate between '{$argu['s_date']} 00:00:00' and '{$argu['e_date']} 23:59:59') ";	}

			$query = "
				select
					count(*)
				from
					adm_log
				".$addwhere;

			$res = $total = $this->DB->getOne($query);
			if (DB::isError($res)) {
				go_url("", $res->getMessage());
				exit;
			}

			$query = "
				select
					*
				from
					adm_log
				".$addwhere."
				order by
					regdate desc
			";
			if($limit)
			$query .= "
				limit ".($argu['p']-1)*$this->_LIST_NUM.",".$this->_LIST_NUM;

			//echo "<pre>$query</pre>";

			$res = $list =& $this->DB->getAll($query, array(), DB_FETCHMODE_ASSOC);

			if (DB::isError($res)) {
				go_url("", $res->getMessage());
				exit;
			}

			return $list;
		}

	}
?>