<?
require_once('include/global.php');

// [2011-03-02] 읽기 창 보여주기
if ($_GET['iframe'])
	die("<script>parent.location.href='mail_list.php?".get_qs('iframe')."';</script>");

require_once("include/mail_lib.php");
require_once('include/pager.php');
require_once('include/file.php');
require_once('conf.inc.php');

// [2020-12] 메일리스트 페이지 사이즈 쿠키값 저장.
if(!$_GET['page_size']) $_GET['page_size'] = $_COOKIE['nm_mail_pagesize'];
if ($_COOKIE['nm_mail_pagesize'] != $_GET['page_size']){
    if($_GET['page_size'])
        setcookie("nm_mail_pagesize", $_GET['page_size'], time()+86400*365, "/");
}
if ($_GET['window_open']) {
	nskinset('webmail', 'mail_list.html', 'window_open');
} else {
	nskinset('webmail', 'mail_list.html');
}
page_loading_view("메일 목록을 가져오고 있습니다.");

// check
//	if (!$_GET['mb_id'])
//		msg('올바른 URL로 접근하여 주십시오');


// set
	$CFG['TITLE'] = '<b>편지읽기</b> >> <b>'.get_mb_name_title($_GET['mb_id']).'</b>';


// data
	// search
		// [2007-11-06] 상세검색
		if (!$_GET['sdp'])
			$_GET['sdp'] = 'A';

	// [2012-03-06]기본 검색에서 검색기간 조건 추가. 검색부하 줄이기 위함.
		if ($_GET['s_date'] == '')
			$_GET['s_date'] = 182;		// 6개월

		// [2025-08-05] 메일 검색 쿼리
		list($q_where, $bindings, $v_s_word, $vs, $mb_child_count) = mail_list_search_query();

		// 검색 기간
		$select_s_date = select_list_value($_GET['s_date'], array_values($G_SYS['NM_SEARCH_DATE_LIST']), array_keys($G_SYS['NM_SEARCH_DATE_LIST']), NULL, 0, 1);


	// sort
		$CFG['MAIL_LIST_FIELD'] = array(
				'is_starred' => '중요 메일',
				'mf_importance' => '중요도',
				'mf_is_read' => '읽지 않은 메일',
				'mf_attach_names' => '첨부파일',
				'mf_from' => '보낸사람',
				'mf_to' => '받는사람',
				'mf_subject' => '제목',
				'mf_arrival_date' => '받은날짜',
				'mf_filesize' => '크기'
				);
		if ($_GET['mb_id'] == 'spam' || $_GET['viewsp'])
		{
			$CFG['MAIL_LIST_FIELD']['mf_spam_point'] = '스팸';
		}	// if()

		$order_set = get_order(array_keys($CFG['MAIL_LIST_FIELD']), 'mf_arrival_date', del_injection_str($_GET['s_key']), del_injection_str($_GET['s_key2']));
		$order_img = get_order_img(array_keys($CFG['MAIL_LIST_FIELD']), del_injection_str($_GET['s_key']), del_injection_str($_GET['s_key2']), false, 'common_skin');		// array

	// db - pager
		$DEBUG['db_cnt']['start'] = getmicrotime();
//		$pager_params['totalItems'] = db_get_one("SELECT COUNT(*) FROM ".$AUTH['auth_m_mf_table']." WHERE m_no='" . $AUTH['auth_m_no'] . "' AND mb_id='". $_GET['mb_id'] . "'" . $q_where);
		$pager_params['totalItems'] = db_get_one("SELECT COUNT(*) FROM ".$AUTH['auth_m_mf_table']." LEFT JOIN ". $TB['MAIL_STAR'] . " ms ON mf_no = ms_mf_no AND m_no = ms_m_no WHERE m_no='" . $AUTH['auth_m_no'] . "'" . $q_where, $bindings);

		// [2006-06-19]
		if (!is_numeric($_GET['page_size']) || $_GET['page_size'] > $G_SYS['MAIL_LIST_COUNT'])
		{
			// [2006-07-25] 기본 설정
			$dfcon = get_default_config($AUTH['auth_m_no']);
			$_GET['page_size'] = $dfcon['m_cfg_mail_list_cnt'];
		}	// if()
		$pager_params['perPage'] = $_GET['page_size'];

		$DEBUG['db_cnt']['exec'] += getmicrotime() - $DEBUG['db_cnt']['start'];

		// [2016-01-11] PHP 5버전대에서 Ampersand가 DEPRECATED처리되어 &삭제
		#$pager = &new Pager_Sliding($pager_params);
		// [2016-01-11] Ampersand가 DEPRECATED관련하여 PEAR Pager라이브러리 업그레이드 소스적용
		#$pager = new Pager_Sliding($pager_params);
		$pager = Pager::factory($pager_params);
		$pager_links = $pager->getLinks();
		$pager_limit = get_pager_limit($pager->getCurrentPageID(), $pager_params['perPage']);

	// db - select
		$DEBUG['db_select']['start'] = getmicrotime();
		$rows = array();
		if ($pager_params['totalItems'] > 0)
		{
			// index
			$q_index = '';
			$q_hint = '';
			$q_stopkey = '';
			if ($G_SYS[DB] == 'oracle' && $_GET['mb_id'])      // [2024-10-07] Oracle 전체메일이 아닐때만 인덱스 힌트 사용
			{
				switch ($order_set['key'])
				{
					case 'mf_arrival_date':
						$q_stopkey = " AND ROWNUM <= '".($pager_limit['from']+$pager_limit['count'])."' ";
						// [2006-09-14] 날짜의 오름차순 정렬이 제대로 안되던 문제 수정.
						$q_hint = "/*+ ORDERED index_".strtolower($order_set['set'])." (".$AUTH['auth_m_mf_table']." MF_".$AUTH['auth_d_no']."_".$AUTH['auth_m_mail_file_group']."_MF_ARRIVAL_DATE) */";
						break;
					case 'mf_filesize':
						$q_stopkey = " AND ROWNUM <= '".($pager_limit['from']+$pager_limit['count'])."' ";
						$q_hint = "/*+ ORDERED index_".strtolower($order_set['set'])." (".$AUTH['auth_m_mf_table']." MF_".$AUTH['auth_d_no']."_".$AUTH['auth_m_mail_file_group']."_MNO_MBID) */";
						break;
				}	// switch()

				if (!$q_hint)
				{
					#$q_hint = "/*+ ORDERED */";
					// [2006-04-05] 날짜, 크기이외의 필드로 정렬시 날짜가 모두 동일하게 나오는 문제로 인해 생략.
					#$q_hint = "/*+ ORDERED index_".strtolower($order_set['set'])." (".$AUTH['auth_m_mf_table']." MF_".$AUTH['auth_d_no']."_".$AUTH['auth_m_mail_file_group']."_MF_ARRIVAL_DATE) */";
				}	// if()
			} else		// mysql 3 에서 역인덱스를 사용하지 못하는 성능상의 문제를 보완하기 위함.
			{
				if ($pager_params['totalItems'] > 100 && $order_set['set'] == 'ASC')		// 100건 이상이고 역인덱스 일때만 stopkey 적용.
				{
					$DEBUG['db_stopkey']['start'] = getmicrotime();
					switch ($order_set['key'])
					{
						case 'mf_arrival_date':
							$_mf_cnt_prev = 0;
							for ($i=1; $i<=10; $i++)
							{
								$_time = time();
								$_date = date('Y-m-d H:i:s', ($_time-(86400*round(pow(1.7,$i)))));
								$sql = "
									SELECT
										COUNT(*)
									FROM
										".$AUTH['auth_m_mf_table']."
										LEFT JOIN ". $TB['MAIL_STAR'] . " ms ON mf_no = ms_mf_no AND m_no = ms_m_no
									WHERE
										m_no='". $AUTH['auth_m_no'] . "'
										" . $q_where . "
										" . $q_stopkey . "
										AND mf_arrival_date >= '".$_date."'
									";
								$_mf_cnt = db_get_one($sql, $bindings);
								if ($_mf_cnt_prev > 0 && $_mf_cnt_prev == $_mf_cnt)
								{
									break;
								} else if ($_mf_cnt >= ($pager_limit['from']+$pager_limit['count']))
								{
									$q_stopkey = " AND mf_arrival_date >= '".$_date."' ";
									break;
								}	// if()
								$_mf_cnt_prev = $_mf_cnt;
							}	// for()
							break;
					}	// switch()
					$DEBUG['db_stopkey']['exec'] += getmicrotime() - $DEBUG['db_stopkey']['start'];
				}	// if()
			}	// if()
			$sql = "
				SELECT
					$q_hint
					mf_no, mf_from, mf_reply_to, mf_sender, mf_to, mf_cc, mf_importance, mf_subject, mf_body, mf_content_type, mf_charset, mf_arrival_date, mf_filename, mf_filesize, mf_attach_names, mf_is_read, mf_is_read_date, mf_is_reply, mf_is_reply_date, mf_is_forward, mf_is_forward_date, mf_send_ip , mf_spam_point , mf_is_userauth, mfext1, ms.id is_starred, mb_id
				FROM
					".$AUTH['auth_m_mf_table']."
					LEFT JOIN ". $TB['MAIL_STAR'] . " ms ON mf_no = ms_mf_no AND m_no = ms_m_no 
				$q_index
				WHERE
					m_no='". $AUTH['auth_m_no'] . "'
					" . $q_where . "
					" . $q_stopkey . "
				ORDER BY
					" . $order_set['query'] . "
				";
			$rows = db_get_rows($sql, $pager_limit['from'], $pager_limit['count'], false, $bindings);
		}	// if()
		$DEBUG['db_select']['exec'] += getmicrotime() - $DEBUG['db_select']['start'];

	// process data
		$DEBUG['db_fetch_all']['start'] = getmicrotime();

		$mi = array();
		$mi_cnt = sizeof($rows);

		// mf_body_title
		// [2006-10-09] 정규표현식 보완
		// [2009-01-05] 특정 메일의 본문으로 인해 메일목록이 제대로 보이지 않는 문제 해결. - 일부서버에서만 발생하는 문제로 &nbsp; 삭제후 해결됨.
		// [2010-03-09] 일부 윈도우 서버에서 발생하는 페이지 멈춤 현상 해결.
		$patterns2 = array(
			#"/\\n( |\\n|\\t|\&nbsp\;)+/",
			#"/\\r\\n( |\\r\\n|\\t)+/",
			#"/\\n([ ]+|\\n|\\t|\&nbsp\;)+/",
			#"/\\n([ ]+|\\n|\\t)+/",
			#"/\\r\\n([ ]+|\\r\\n|\\t)+/",
			"/\n[ \n]+/",
			);
		$replacements2 = array(
			"\n",
			);
		for ($i=0; $i<$mi_cnt; $i++)
		{
			$mi['mf_spam_point'][] = $rows[$i]['mf_spam_point'];
			// [2025-04-17] 메일 제목 길이 제한없이 모두 보여주기 (CSS 에서 1줄로 제한중)
//			$mi['mf_subject'][] = (trim($rows[$i]['mf_subject']) == NULL) ? '__제목없음__' : htmlspecialchars_fix(han_substr($rows[$i]['mf_subject'],100));
			$mi['mf_subject'][] = (trim($rows[$i]['mf_subject']) == NULL) ? '__제목없음__' : htmlspecialchars_fix($rows[$i]['mf_subject']);

			$DEBUG['mf_body_title']['start'] = getmicrotime();

			// [2009-06-09] 본문 미리보기에서 일부 스타일 태그 등이 보이는 문제 보완
			// [2014-03-12] 메일 본문이 클 경우를 위한 부하 감소
			//$_mf_body_title = $rows[$i]['mf_body'];

			// [2025-10-15] mail_body_text_preview 함수화 후 주석처리
			/*$_mf_body_title = htmlspecialchars_fix(substr(strip_tags($rows[$i]['mf_body']), 0, 10240));
			if ($rows[$i]['mf_content_type'] == 'H')
			{
				// [2014-03-12] 메일 본문이 클 경우를 고려하여 생략.
				//$_mf_body_title = set_mailbody_html($_mf_body_title, $_GET['mb_id']);
				$_mf_body_title = preg_replace("/<br[^>]*>/i", "\n", $_mf_body_title);
				// [2007-12-20]  특정 메일의 본문으로 인해 메일목록이 제대로 보이지 않는 문제 해결.
				// [2008-10-13] 특정 메일의 본문이 지나치게 커서 시간이 오래 걸리는 문제 보완.
				//$_mf_body_title = htmlspecialchars_fix(substr(strip_tags($_mf_body_title), 0, 10240));
				$_mf_body_title = han_substr(strip_tags($_mf_body_title),2048);
			}	// if()

			// [2010-03-09] 일부 윈도우 서버에서 발생하는 페이지 멈춤 현상 해결.
			$_mf_body_title = str_replace(array("\r\n", "&nbsp;"), array("\n", " "), $_mf_body_title);
			$_mf_body_title = preg_replace($patterns2, $replacements2, $_mf_body_title);
			// [2008-02-29] 특정 메일의 본문으로 인해 메일목록이 제대로 보이지 않는 문제 해결.
			//$_mf_body_title = htmlspecialchars_fix(han_substr(trim($_mf_body_title), 512));
			$_mf_body_title = htmlspecialchars_fix(han_substr(trim($_mf_body_title), 512)).'  ';*/
			$_mf_body_title = mail_body_text_preview($rows[$i]['mf_body'], $G_SYS['MAIL_BODY_TEXT_PREVIEW_MAX_BODY'], $G_SYS['MAIL_BODY_TEXT_PREVIEW_MAX_TEXT']);
			$mi['mf_body_title'][] = ($_mf_body_title == '') ? ' &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ' : $_mf_body_title;
			$DEBUG['mf_body_title']['exec'] += getmicrotime() - $DEBUG['mf_body_title']['start'];

			$mi['mf_arrival_date'][] = ($rows[$i]['mf_arrival_date'] != '0000-00-00 00:00:00') ? date('y-m-d H:i', strtotime($rows[$i]['mf_arrival_date'])) : '__날짜없음__';

			// [2014-01-10] 목록에서는 보낸이, 받는이가 많을 경우 일부만 보여주도록 보완.
			$rows[$i]['mf_from'] = han_substr($rows[$i]['mf_from'], 1024);
			$rows[$i]['mf_to'] = han_substr($rows[$i]['mf_to'], 1024);

			$mi['mf_from'][] = address_view($rows[$i]['mf_from'], false, NULL, false);
			$mi['mf_from_title'][] = htmlspecialchars_fix(rtrim($rows[$i]['mf_from'], ','));
			$mi['mf_to'][] = address_view($rows[$i]['mf_to'], false, NULL, false);
			$mi['mf_to_title'][] = htmlspecialchars_fix(rtrim($rows[$i]['mf_to'], ','));
			// [2025-10-15] 참조 보여주기 위해 추가
			$mi['mf_cc_title'][] =  htmlspecialchars_fix(rtrim($rows[$i]['mf_cc'], ','));

			$mi['is_attachment'][] = ($rows[$i]['mf_attach_names'] != NULL) ? 'Y' : 'N';
			$mi['mf_filesize'][] = filesize_human($rows[$i]['mf_filesize']);
			$mi['mf_no'][] = $rows[$i]['mf_no'];
			$mi['mf_is_read'][] = $rows[$i]['mf_is_read'];
			$mi['mf_importance'][] = $rows[$i]['mf_importance'];
			$mi['mf_send_ip'][] = $rows[$i]['mf_send_ip'];
			$mi['mf_is_userauth'][] = $rows[$i]['mf_is_userauth'];
			$mi['mfext1'][] = $rows[$i]['mfext1'];
			$mi['mf_is_reply'][] = $rows[$i]['mf_is_reply'];
			$mi['mf_is_reply_date'][] = $rows[$i]['mf_is_reply_date'];
			$mi['mf_is_forward'][] = $rows[$i]['mf_is_forward'];
			$mi['mf_is_forward_date'][] = $rows[$i]['mf_is_forward_date'];
			$mi['is_starred'][] = ($rows[$i]['is_starred'] != NULL ) ? 'Y' : 'N';
			$mi['mb_id'][] = $rows[$i]['mb_id'];
		}	// for()

		$DEBUG['db_fetch_all']['exec'] += getmicrotime() - $DEBUG['db_fetch_all']['start'];

	// 메일수
		$DEBUG['db_cnt_unread']['start'] = getmicrotime();

		if ($_GET['s_noread']) {        // 안읽음은 전체 개수를 카운트하고, 목록 개수를 안읽음으로 표시
			$sql             = "SELECT COUNT(*) FROM " . $AUTH['auth_m_mf_table'] . " LEFT JOIN ". $TB['MAIL_STAR'] . " ms ON mf_no = ms_mf_no AND m_no = ms_m_no WHERE m_no='" . $AUTH['auth_m_no']
				. "' " . preg_replace('/AND mf_is_read = \'N\'/', '', $q_where);
			$mail_all_cnt = db_get_one($sql, $bindings);
			$mail_unread_cnt = $pager_params['totalItems'];
		} else {
			$mail_all_cnt = $pager_params['totalItems'];
//		$sql = "SELECT COUNT(*) FROM ".$AUTH['auth_m_mf_table']." WHERE m_no='". $AUTH['auth_m_no'] . "' AND mb_id='".$_GET['mb_id']."' AND mf_is_read='N'" . $q_where;
			$sql             = "SELECT COUNT(*) FROM " . $AUTH['auth_m_mf_table'] . " LEFT JOIN ". $TB['MAIL_STAR'] . " ms ON mf_no = ms_mf_no AND m_no = ms_m_no WHERE m_no='" . $AUTH['auth_m_no']
				. "' AND mf_is_read='N'" . $q_where;
			$mail_unread_cnt = db_get_one($sql, $bindings);
		}
		// [2025-09-18] 중요메일 수
		if ($_GET['s_star']) {
			$sql             = "SELECT COUNT(*) FROM " . $AUTH['auth_m_mf_table'] . " LEFT JOIN ". $TB['MAIL_STAR'] . " ms ON mf_no = ms_mf_no AND m_no = ms_m_no WHERE m_no='" . $AUTH['auth_m_no']
				. "' " . preg_replace('/AND ms.id is not null/', '', $q_where);
			$mail_all_cnt = db_get_one($sql, $bindings);
			$sql             = "SELECT COUNT(*) FROM " . $AUTH['auth_m_mf_table'] . " LEFT JOIN ". $TB['MAIL_STAR'] . " ms ON mf_no = ms_mf_no AND m_no = ms_m_no WHERE m_no='" . $AUTH['auth_m_no']
				. "' AND mf_is_read='N'" . preg_replace('/AND ms.id is not null/', '', $q_where);
			$mail_unread_cnt = db_get_one($sql, $bindings);

			$mail_star_cnt = $pager_params['totalItems'];
		} else {
			$sql = "SELECT COUNT(*) FROM " . $AUTH['auth_m_mf_table'] . " LEFT JOIN ". $TB['MAIL_STAR'] . " ms ON mf_no = ms_mf_no AND m_no = ms_m_no WHERE m_no='" . $AUTH['auth_m_no']
				. "' AND ms.id is not null" . preg_replace('/AND mf_is_read = \'N\'/', '', $q_where);
			$mail_star_cnt = db_get_one($sql, $bindings);
		}

		// [2024-09-21] 안읽음 검색시에도 '전체' 개수에 콤마 표시
		$mail_all_cnt = number_format($mail_all_cnt);
		$mail_unread_cnt = number_format($mail_unread_cnt);
		$mail_star_cnt = number_format($mail_star_cnt);

		$DEBUG['db_cnt_unread']['exec'] += getmicrotime() - $DEBUG['db_cnt_unread']['start'];

	// 메일박스
		$mail_box = get_mail_box();
		$_mail_box = db_rows_fieldtokey($mail_box);
		$select_mail_box = select_list_value($_GET['mb_id'], $_mail_box['mb_name'], $_mail_box['mb_id'], NULL, 0, 1);

	// [2025-11-03] 편지함 트리 지원
	$cg                = get_mail_box_tree_class();
	$cg_dataall        = $cg->getRowsByParent(0, 255, 1, "AND " . get_mail_box_where());
	$cg_dataall_option = $cg->getSelectOption($cg_dataall);
	$select_mail_box_parent        = select_list_value(
		$_GET['mb_id'], $cg_dataall_option['val'], $cg_dataall_option['key'], null, 0, 1
	);

	// [2006-03-08] 보관기간
		$_as = array_search($_GET['mb_id'], $_mail_box['mb_id']);
		$mb_saveday = ($_as !== false) ? $_mail_box['mb_saveday'][$_as] : 0;
		$mb_name = ($_as !== false) ? $_mail_box['mb_name'][$_as] : 0;


	// [2006-07-05] 부가기능
		$select_cmd = select_list_value('', array_values($G_SYS['MAIL_LIST_CMD']), array_keys($G_SYS['MAIL_LIST_CMD']), lang_conv('부가 기능').' ▼', 0, 1);


// skin view
	// [2011-03-02] 읽기 창 보여주기
	ob_start();
	include(nskindir('webmail').'/mail_list.head.html');
	$G_SYS['NM_HTML_HEAD'] .= ob_get_contents();
	ob_end_clean();

	page_loading_view_hidden();
	include($NSKIN['view_layout']);

	// [2010-09-10] 편지목록에서 선택한 메일만 백업할 때, ActiveX 사용여부.(기본값은 false)
	if ($G_SYS['MAIL_BOX_BACKUP_ACTIVEX_USE'])
	{
		include('include/download_activex.php');
	}	// if()

require_once('include/global_end.php');
?>