<?
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');

nskinset('webmail', 'mail_list.html');
page_loading_view("메일 목록을 가져오고 있습니다.");

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


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


// data
	// search
		$q_where = '';

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

		$vs = array();
		if ($_GET['sd'] == '1')
		{
			$s_key = array('s_from', 's_to', 's_cc', 's_subject', 's_body', 's_attach');
			$s_filed = array('mf_from', 'mf_to', 'mf_cc', 'mf_subject', 'mf_body', 'mf_attach_names');
			for ($i=0; $i<sizeof($s_key); $i++)
			{
				if (trim($_GET[$s_key[$i]]) != '')
				{
					set_q_search($_GET[$s_key[$i]]);

					if ($G_SYS[DB] == 'oracle')
					{
						if ($s_filed[$i] == 'mf_body')
						{
							$q_where .= " AND dbms_lob.instr(mf_body, '" . $_GET[$s_key[$i]] . "')>0 ";
						} else
						{
							$q_where .= " AND ".$s_filed[$i]." LIKE '%" . $_GET[$s_key[$i]] . "%' ";
						}	// if()
					} else
					{
						$q_where .= " AND ".$s_filed[$i]." LIKE '%" . $_GET[$s_key[$i]] . "%' ";
					}	// if()

					$vs[$s_key[$i]] = htmlspecialchars_fix(stripslashes($_GET[$s_key[$i]]));					
				}	// if()
			}	// for()

			if ($_GET['sd1'] && strtotime($_GET['sd1']))
			{
				$_ex = explode('-', $_GET['sd1']);
				$_GET['sd1'] = sprintf('%04d', $_ex[0]).'-'.sprintf('%02d', $_ex[1]).'-'.sprintf('%02d', $_ex[2]);				

				if ($_GET['sd2'] && strtotime($_GET['sd2']))
				{
					$_ex = explode('-', $_GET['sd2']);
					$_GET['sd2'] = sprintf('%04d', $_ex[0]).'-'.sprintf('%02d', $_ex[1]).'-'.sprintf('%02d', $_ex[2]);				

					$q_where .= " AND mf_arrival_date >= '".$_GET['sd1']." 00:00:00' AND mf_arrival_date <= '".$_GET['sd2']." 23:59:59' ";
				}	// if()
			}	// if()

			$vs['basic_display'] = 'none';
			$vs['detail_display'] = '';

		} else
		{
			if ($_GET['s_word'])
			{
				set_q_search($_GET['s_word']);
				/*
				if (strpos($_GET['s_word'], ' ') !== false)
				{
					$q_where .= " AND ( 0 ";
					$_ex = explode(' ', $_GET['s_word']);
					for ($i=0; $i<sizeof($_ex); $i++)
					{
						$_word = trim($_ex[$i]);
						if (strlen($_word) >= 2)
						{
							$q_where .= " OR mf_subject LIKE '%" . $_word . "%' ";
							$q_where .= " OR mf_from LIKE '%" . $_word . "%' ";
							$q_where .= " OR mf_body LIKE '%" . $_word . "%' ";
						}	// if()
					}	// for()
					$q_where .= " ) ";
				} else
				{
				*/
					// 제목, 보낸사람, 본문 검색
					// [2006-02-28] 8i 지원
					// [2012-05-10] 보낸편지함/임시보관함에서는 '보낸사람'대신 '받는사람'을 검색하도록 함.
					if ($_GET['mb_id'] == 'sent' || $_GET['mb_id'] == 'draft')
					{
						$q_from_to = 'mf_to';
					} else 
					{
						$q_from_to = 'mf_from';
					}	// if()
					if ($G_SYS[DB] == 'oracle')
					{
						$q_where = " AND ( mf_subject LIKE '%" . $_GET['s_word'] . "%' OR ".$q_from_to." LIKE '%" . $_GET['s_word'] . "%' OR  dbms_lob.instr(mf_body, '" . $_GET['s_word'] . "')>0 ) ";
					} else
					{
						$q_where = " AND ( mf_subject LIKE '%" . $_GET['s_word'] . "%' OR ".$q_from_to." LIKE '%" . $_GET['s_word'] . "%' OR mf_body LIKE '%" . $_GET['s_word'] . "%' ) ";
					}	// if()

					#$q_where .= " AND ( mf_subject LIKE '%" . $_GET['s_word'] . "%' ) ";
				#}	// if()
				// 제목, 보낸사람 검색
				#$q_where = " AND ( mf_subject LIKE '%" . $_GET['s_word'] . "%' OR mf_from LIKE '%" . $_GET['s_word'] . "%' ) ";
				$v_s_word = htmlspecialchars_fix(stripslashes($_GET['s_word']));


				// [2012-03-06]기본 검색에서 검색기간 조건 추가
				if (is_numeric($_GET['s_date']) && $_GET['s_date'] > 0)
				{
					$_time = time();
					$_sd1 = date('Y-m-d', $_time-(86400*$_GET['s_date']));
					$_sd2 = date('Y-m-d', $_time);
					$q_where .= " AND mf_arrival_date >= '".$_sd1." 00:00:00' AND mf_arrival_date <= '".$_sd2." 23:59:59' ";
				}	// if()
			}	// if()

			$vs['basic_display'] = '';
			$vs['detail_display'] = 'none';

		}	// if()

	// [2012-03-06]기본 검색에서 검색기간 조건 추가. 검색부하 줄이기 위함.
		if ($_GET['s_date'] == '')
			$_GET['s_date'] = 182;		// 6개월
		$select_s_date = select_list_value($_GET['s_date'], array("1주일", "1개월", "3개월", "6개월", "1년", "전체"), array(7, 31, 91, 182, 365, 0), NULL, 0, 1);


	// sort
		$CFG['MAIL_LIST_FIELD'] = array(
				'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', $_GET['s_key'], $_GET['s_key2']);
		$order_img = get_order_img(array_keys($CFG['MAIL_LIST_FIELD']), $_GET['s_key'], $_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);

		// [2006-06-19]
		if (!is_numeric($_GET['page_size']) || $_GET['page_size'] > 100)
		{
			// [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'];

		$pager = &new Pager_Sliding($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')
			{
				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']."
									WHERE
										m_no='". $AUTH['auth_m_no'] . "'
										AND mb_id='". $_GET['mb_id']. "'
										" . $q_where . "
										" . $q_stopkey . "
										AND mf_arrival_date >= '".$_date."'
									";
								$_mf_cnt = db_get_one($sql);
								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
				FROM
					".$AUTH['auth_m_mf_table']."
				$q_index
				WHERE
					m_no='". $AUTH['auth_m_no'] . "'
					AND mb_id='". $_GET['mb_id']. "'
					" . $q_where . "
					" . $q_stopkey . "
				ORDER BY
					" . $order_set['query'] . "
				";
			$rows = db_get_rows($sql, $pager_limit['from'], $pager_limit['count']);
		}	// 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++)
		{
			$_sc = '#000000';
			if ($_GET['mb_id'] == 'spam' || $_GET['viewsp'])
			{
				if ($rows[$i]['mf_spam_point'] >= 9)
				{
					$_sc = '#939393';
				} else if ($rows[$i]['mf_spam_point'] >= 5)
				{
					$_sc = '#7D7D7D';
				} else if ($rows[$i]['mf_spam_point'] >= 3)
				{
					$_sc = '#494949';
				}	// if()
			}	// if()
			$mi['spam_color'][] = $_sc;
			$mi['mf_spam_point'][] = $rows[$i]['mf_spam_point'];
			$mi['mf_subject'][] = (trim($rows[$i]['mf_subject']) == NULL) ? '__제목없음__' : htmlspecialchars_fix(han_substr($rows[$i]['mf_subject'],100));

			$DEBUG['mf_body_title']['start'] = getmicrotime();
			
			// [2009-06-09] 본문 미리보기에서 일부 스타일 태그 등이 보이는 문제 보완
			$_mf_body_title = $rows[$i]['mf_body'];
			if ($rows[$i]['mf_content_type'] == 'H')
			{
				$_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)).'  ';
			$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'])) : '__날짜없음__';
			$mi['mf_from'][] = address_view($rows[$i]['mf_from'], false, $_sc);
			$mi['mf_from_title'][] = htmlspecialchars_fix($rows[$i]['mf_from']);
			$mi['mf_to'][] = address_view($rows[$i]['mf_to'], false, $_sc);
			$mi['mf_to_title'][] = htmlspecialchars_fix($rows[$i]['mf_to']);
			$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'];
		}	// for()

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

	// 메일수
		$DEBUG['db_cnt_unread']['start'] = getmicrotime();
		$mail_all_cnt = number_format($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;
		$mail_unread_cnt = db_get_one($sql);
		$mail_unread_cnt = number_format($mail_unread_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);

	// [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');
?>