package com.eactive.eai.rms.onl.common.util;

import javax.servlet.http.HttpServletRequest;

/**
 * 목록의 페이지 처리관련 
 * 유틸리티 클래스입니다.
 * 
 */
public class PageNavigator {
	
	int total;  // 총 게시물 수
	int totalPage;  // 총 페이지
	int currentPage;  // 현재 페이지
	int displayCount = 10;  // 한 페이지에 보여지는 목록수
	double pageGroupSize = 10.0;  // 페이지 리스트 사이즈
	//String url;  // 페이지별 URL경로
	String contextPath;  // 웹 Context-path
	String delemeter="|";  // 페이지 번호 구분자 (ex. 1 | 2 | 3 ...)
	
	static String prevImg;  // 이전 페이지 이동 이미지
	static String nextImg;  // 다음 페이지 이동 이미지
	static String beginImg; // 첫 페이지 이동 이미지
	static String endImg;  // 마지막 페이지 이동 이미지

	
	public PageNavigator()
	{	
	}
	
	/**
	 * 페이지 네비게이터 초기값 설정
	 * 
	 * @param request
	 * @param total
	 * @param totalPage
	 * @param currentPage
	 * @param displayCount
	 * @param pageGroupSize
	 * @param url
	 */
	public void setPageNavigator(
			HttpServletRequest request,
			int total, 
			int currentPage, 
			int displayCount) 
	{
		this.contextPath = request.getContextPath();
		this.total = total;
		this.currentPage = getPageNum(total, currentPage, displayCount);
		this.displayCount = displayCount;
		
		
		this.prevImg = "<img src='"+contextPath+"/images/bt/bt_list_prev.gif' border='0' style='cursor:hand'>";
		this.nextImg = "<img src='"+contextPath+"/images/bt/bt_list_next.gif' border='0' style='cursor:hand'>";
		this.beginImg = "<img src='"+contextPath+"/images/bt/bt_list_reprev.gif' border='0' style='cursor:hand'>";
		this.endImg = "<img src='"+contextPath+"/images/bt/bt_list_renext.gif' border='0' style='cursor:hand'>";
	}
	
	/**
	 * 페이지 네비게이션 문자열 얻기
	 * @return
	 */
	protected String makePageLink()
	{
		int startPage;  // 페이지 리스트 그룹 시작번호
		int endPage;  // 페이지 리스트 그룹 끝번호
		
		if(total == 0) return "";
		
		// 소수점 계산을 위해 double형으로 계산.
		totalPage = (int)(Math.ceil((total/new Double(displayCount).doubleValue())));
		
		// 현재 페이지가 속한 페이지 그룹
		int currentPageGroup = 
			(int)(Math.ceil(currentPage/(pageGroupSize)));
		
		//전체 페이지 그룹
		int totalPageGroup =
			(int)(Math.ceil(totalPage/(pageGroupSize)));
		
		startPage = (int)((currentPageGroup-1) * pageGroupSize+1);
		endPage = (int)(currentPageGroup * pageGroupSize);
		
		// endPage는 전체 페이지보다 작아야 함.
		if(endPage > totalPage)
			endPage = totalPage;
			
		
		// 출력 문자열 작성
		StringBuffer buf = new StringBuffer();
//		buf.append( "<style type=text/css>")
//		.append("a:link {  font-size: 9pt; color: #003399; text-decoration: none} ")
//		.append("a:visited {  font-size: 9pt; color: #003399; text-decoration: none} ")
//		.append("a:hover {  font-size: 9pt; color: #0066CC; text-decoration: underline} ")
//		.append("a:active {  font-size: 9pt; color: #0066CC; text-decoration: none} ")
//		.append("</style>");		
		buf.append("<table width='230' height='19' border='0' cellpadding='0' cellspacing='0'>");
		buf.append("<tr align='center'>");
		
		if(currentPageGroup > 2) {
			buf.append("<td width='15'>");
			buf.append(makeLinkWithPageParamNospace(1,beginImg));
			buf.append("</td>");
		}
		if(currentPageGroup > 1) {
			int prevPage =(int)((currentPageGroup-2)*pageGroupSize+1);
			buf.append("<td width='15'>");				
			buf.append(	makeLinkWithPageParamNospace(prevPage,prevImg));
			buf.append("</td>");
		}
		buf.append("<td width='160' style='font-size:11'>");
        for(int i=startPage; i<=endPage ;i++){
        	if(i == startPage){
        		//buf.append("&nbsp;");
        	}
        	if (i==currentPage) buf.append("<B>").append(i).append("</B>");
        	else buf.append(makeLinkWithPageParam(i, (i)+""));
        	if(i != endPage){
        		buf.append(delemeter);
        	}else {
        	//	buf.append("&nbsp;");
        	}
        	
        } // end for
		buf.append("</td>");
        if(currentPageGroup < totalPageGroup ){
			int nextPage = (int)( currentPageGroup*pageGroupSize+1 );
			buf.append("<td width='15'>");
			buf.append(	makeLinkWithPageParamNospace(nextPage, nextImg));
			buf.append("</td>");
		}
       
		if((currentPageGroup +1) < totalPageGroup ){
			buf.append("<td width='15'>");
			buf.append(makeLinkWithPageParamNospace(totalPage, endImg));
			buf.append("</td>");				
		}
		buf.append("</tr>");
		buf.append("</table>");
		
		return buf.toString();
		
	}
	
	/**
	 * 페이지 번호 앞에 공백을 넣을 경우 호출하는 메소드
	 * 
	 * @param pageNum
	 * @param displayStr
	 * @return
	 */
    protected String makeLinkWithPageParam(int pageNum, String displayStr) {
        
        return "&nbsp;<a href='javascript:setCurrentPageNum(\""+pageNum+"\")'>"+displayStr+"</a>";
    } 
    
    /**
     * 페이지 번호 앞에 공백을 넣지 않는 경우 호출하는 메소드
     * 
     * @param pageNum
     * @param displayStr
     * @return
     */
    protected String makeLinkWithPageParamNospace(int pageNum, String displayStr) {
        
        return "<a href='javascript:setCurrentPageNum(\""+pageNum+"\")'>"+displayStr+"</a>";
    } 
    
    
	/**
	 * 현재 페이지가 총 페이지보다 크다면, 현재 페이지값에 
	 * 마지막 페이지값을 셋팅한다.
	 * 
	 * @param totalCount 전체 row 수
	 * @param page 현재 페이지 번호
	 * @param displayCount 한 페이지에 보여질 row 수
	 * @return
	 */
    protected int getPageNum(int totalCount, int page, int displayCount)
	{
	    final int totalPage = (int)(Math.ceil((totalCount/new Double(displayCount).doubleValue())));  // 총 페이지 번호
	    int pageNum=page;
	    if(page > totalPage && totalPage > 0)  // 만약, 현재 페이지가 총 페이지 보다 크다면 현재 페이지값에 마지막 페이지값을 셋팅.
	    {
            pageNum = totalPage;
	    }
	    return pageNum;
	}
    
    /**
     * 페이징 된 문자열을 리턴한다.
     */
	public String getPagingStr(){
		return makePageLink();
	}
}
















