package com.eactive.eai.common.web;

/*
* @@(#)PageListTag.java
* @@author Jeon HongSeong
* @@version 1.0
* Copyright (c) 1998-2001 InfoTops Co., Ltd. All Rights Reserved.
*/

import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
import java.io.IOException;


/** 
 * 1. 기능 : 관리자 화면에서 페이지 리스트를 만들어 준다.
 * 2. 처리 개요 : 관리자 화면에서 Page List를 구성하기위한 정보를 저장
 *	totalCount 전체 레코드 갯수
 *	viewPage 현재 페이지 번호
 *	rowPerPage 한 페이지당 레코드 건수
 *	pageListCount 한 페이지 리스트당 페이지 갯수
 *	viewPageColor 현재 페이지 색깔
 *	javaScript 페이지 이동 자바스크립트 함수 / 페이지 이동 href
 *	first, prev, next, last 버튼 (처음, 이전 블럭, 다음 블럭, 마지막)
 * |◀ ◀  [11] [12] [13] [14] [15] [16] [17] [18] [19] [20]  ▶ ▶|
 * 3. 주의사항 
 *
 * @author  :
 * @version : v 1.0.0
 * @see : 
 * @since   : 
 *  : 
 */

public class PageListTag extends TagSupport
{
	private int totalCount;
	private int viewPage;

	private int rowPerPage;
	private int pageListCount;

	private String javaScript;
	private String viewPageColor;

	private String first;
	private String prev;
	private String next;
	private String last;

//	private final static int DEFAULT_ROW_PER_PAGE = 10;
//	private final static int DEFAULT_PAGE_LIST_COUNT = 10;
//	private final static String DEFAULT_JAVA_SCRIPT = "gotoPage";
//	private final static String DEFAULT_VIEW_PAGE_COLOR = "#FF6300";

	private final static String DEFAULT_FIRST_BUTTON = "|◀";
	private final static String DEFAULT_PREV_BUTTON = "◀";
	private final static String DEFAULT_NEXT_BUTTON = "▶";
	private final static String DEFAULT_LAST_BUTTON = "▶|";

	//mendatory : total row count
	public void setTotalCount(int totalCount)
	{
		this.totalCount = totalCount;
	}

	//view page number
	public void setViewPage(int viewPage)
	{
		this.viewPage = (viewPage < 1) ? 1 : viewPage;
	}

	//row per page
	public void setRowPerPage(int rowPerPage)
	{
		this.rowPerPage = rowPerPage;
	}

	//page list count
	public void setPageListCount(int pageListCount)
	{
		this.pageListCount = pageListCount;
	}

	//java script function name
	public void setJavaScript(String javaScript)
	{
		this.javaScript = javaScript;
	}

	//view page color
	public void setViewPageColor(String viewPageColor)
	{
		this.viewPageColor = viewPageColor;
	}

	//first button
	public void setFirst(String first)
	{
		this.first = first;
	}

	//previous button
	public void setPrev(String prev)
	{
		this.prev = prev;
	}

	//next button
	public void setNext(String next)
	{
		this.next = next;
	}

	//last button
	public void setLast(String last)
	{
		this.last = last;
	}

	private String getPageList(
		int		rowCount,				//전체 레코드 갯수
		int		viewPage,				//현재 페이지 번호
		int		rowPerPage,			//한 페이지당 레코드 갯수
		int		pageListCount,		//한 페이지당 하단 페이지 갯수
		String	javascript_name,		//자바스크립트
		String	current_page_color,	//현재 페이지 색깔
		String	first_button,
		String	prev_button,
		String	next_button,
		String	last_button
	)
	{
		int intTotPage = 0; 		//전체 페이지 갯수
		int intStartPage = 0;	//페이지 리스트를 시작할 페이지 번호
		int intEndPage = 0;		//페이지 리스트가 끝나는 페이지 번호

		//페이지 리스트를 시작할 페이지를 계산한다.
		intStartPage = (int) Math.ceil((viewPage - 1) / pageListCount);
		intStartPage = (intStartPage * pageListCount) + 1;
		if (intStartPage % pageListCount == 0) intStartPage = intStartPage - pageListCount + 1 ;

		//전체 페이지 갯수를 계산한다.
//		intTotPage = ( (rowCount % rowPerPage) > 0 ) ? 1 : 0;
//		intTotPage = (int) Math.ceil(rowCount / rowPerPage) + intTotPage;
		intTotPage = getTotalPage(rowCount, rowPerPage);

		//페이지 리스트가 끝나는 페이지를 계산한다.
		intEndPage = (intTotPage >= (pageListCount + intStartPage))
			? intStartPage + pageListCount - 1
			: intStartPage + (intTotPage - intStartPage);


		StringBuffer sb = new StringBuffer();
		//첫번째 페이지(리스트)로 이동 : |◀
		//<a href="javascript:gotoPage(1);">|◀</a>

		//if ( viewPage > 1 )
		//if ( intStartPage > (pageListCount * 2) )
		//System.out.println( intStartPage+"====="+pageListCount+"****************");
		if ( intStartPage > pageListCount )
		{
			sb.append("<a href=\"javascript:");
			sb.append(javascript_name);
			sb.append("(1);\">");
			sb.append( first_button );
			sb.append("</a>");
			sb.append("\n");
		}
		else
		{
			sb.append( first_button );
			sb.append("\n");
		}

		//이전 페이지 리스트로 이동 : ◀
		//<a href="javascript:gotoPage(11);">◀</a> --16 - 5 = 11
		if (intStartPage > pageListCount)
		{
			sb.append("<a href=\"javascript:");
			sb.append(javascript_name).append("(");
			sb.append(intStartPage - pageListCount);
			sb.append(");\">");
			sb.append( prev_button );
			sb.append("</a>");
			sb.append("</a>");
			sb.append("\n");
			sb.append("&nbsp;");
			sb.append("\n");
		}

		else
		{
			sb.append( prev_button );
			sb.append("\n");
			sb.append("&nbsp;");
			sb.append("\n");
		}

		//해당 페이지로 이동 : [16][17][18][19][20] -- 현재페이지 = 17
		for (int i=intStartPage; i<=intEndPage; i++)
		{
			if (viewPage == i)
			{
				sb.append("<font size=\"2\" color=\"");
				sb.append(current_page_color);
				sb.append("\"><b>[");
				sb.append(i);
				sb.append("]</b></font>");
				sb.append("\n");
			}

			else
			{
				sb.append("<a href=\"javascript:");
				sb.append(javascript_name);
				sb.append("(");
				sb.append(i);
				sb.append(");\">[");
				sb.append(i);
				sb.append("]</a>");
				sb.append("\n");
			}
		}

		//다음 페이지 리스트로 이동 : ▶
		//<a href="javascript:gotoPage(21);">▶</a> --16 + 5 = 21
		if (intTotPage > intEndPage )
		{
			sb.append("&nbsp;");
			sb.append("\n");
			sb.append("<a href=\"javascript:");
			sb.append(javascript_name);
			sb.append("(");
			sb.append(intStartPage + pageListCount);
			sb.append(");\">");
			sb.append( next_button );
			sb.append("</a>");
			//sb.append("</a>&nbsp;");
			sb.append("\n");
		}
		else
		{
			sb.append("&nbsp;");
			sb.append("\n");
			sb.append( next_button );
			//sb.append("&nbsp;");
			sb.append("\n");
		}

		//마지막 페이지 리스트로 이동 : ▶|
		//<a href="javascript:gotoPage(41);">▶|</a> --intTotPage
		//if (intTotPage >= ( intStartPage + (pageListCount * 2) ))
		if (intTotPage > intEndPage )
		{
			sb.append("<a href=\"javascript:");
			sb.append(javascript_name);
			sb.append("(");
			sb.append(intTotPage);
			sb.append(");\">");
			sb.append(last_button);
			sb.append("</a>");
			//sb.append("\n");
		}

		else
		{
			sb.append(last_button);
		}

		return sb.toString();
	}

	public int doStartTag()
		throws JspTagException
	{
		try {

			if (totalCount <=0 )
				return SKIP_BODY;



			JspWriter out = pageContext.getOut();

			out.println(
				getPageList(
					totalCount,
					(viewPage <= 0)? 1 : viewPage,
					(rowPerPage > 0) ? rowPerPage : 10,
					(pageListCount > 0)	? pageListCount : 5,
					javaScript,
					(viewPageColor != null && viewPageColor.length() > 0)? viewPageColor : "#FF9933",
					(first != null && first.length() > 0) ? first : DEFAULT_FIRST_BUTTON,
					(prev != null && prev.length() > 0)	? prev : DEFAULT_PREV_BUTTON,
					(next != null && next.length() > 0) ? next : DEFAULT_NEXT_BUTTON,
					(last != null && last.length() > 0)	? last : DEFAULT_LAST_BUTTON
				)
			);
			return SKIP_BODY;
		}
		catch (IOException e)
		{
			throw new JspTagException( "IOException:" +e.toString() );
		}
		catch (Exception e)
		{
			throw new JspTagException( "Exception:" +e.toString() );
		}
	}

	private int getTotalPage(int rowCount, int rowPerPage)
	{
		return ( (int)(Math.ceil(rowCount/rowPerPage)) + ( (rowCount%rowPerPage)>0?1:0) );
	}
}