/*
Object:		PageControl
Description:根据记录总数recordCount和每页显示的记录数pageSize,在页面上显示前后翻页等控制元素,提交需要显示页面的页码.
Fields:		useForm		--false表示使用页面提供的Form作为提交页码所需的Form;true则会自行创建该Form(缺省为false).
			groupSize	--当页码很多时，将页码分组显示，该值指定每一组显示多少个页码,-1显示所有页码(缺省为10).
			pageNoElementName	--指定向后台提交页码的Input Text元素的名称(缺省为'PAGENO')	--new 2001-04-17
			onPageChange--事件句柄，提交页码之前执行(缺省为null)		--new 2001-04-18
			hostForm	--可以指定PageNo元素所在Form(是Form对象，不是名称)，
						  将从这个Form提交页码和其中的所有元素(缺省为null)	--new 2001-04-19
			textStrs	--指定用来控制页码的控制元素的内容,长度为4的数组,每个元素的含义如下：
						0:	控制向前翻一页的元素(缺省为"前一页")
						1:	控制显示前一组页码的元素(缺省为"<<")
						2:	控制显示后一组页码的元素(缺省为">>")
						3:	控制向后翻一页的元素(缺省为"后一页")
			styleClasses--指定用来控制页码的控制元素的样式,长度为3的数组,每个元素的含义如下：
						0:	控制向前翻页、向后翻页的元素的样式(缺省为"")
						1:	控制前一组、后一组的元素的样式(缺省为"")
						2:	控制页码的元素的样式(缺省为"")
Methods:	setTextStrs		--设置用来控制页码的控制元素的内容,参数为一个长度为4的数组,参见textStrs
			setStyleClasses	--设置用来控制页码的控制元素的样式,参数为一个长度为3的数组,参见styleClasses
			drawText		--生成所有控制元素
			reset			--重置页码参数至初始状态
Author:		xjzhang
Last Update:2001-04-19
*/


/*
Usage:
	1.按缺省方式显示控制元素
		a.首先引用本文件: <script language="javascript" src="PageControlPanel.js"></script>
		b.在jsp页面中需要显示控制元素的地方加入下面代码：
			<script language="javascript">
				pageControlDrawText(<%=recordCount%>,<%=pageSize%>,<%=request.getParameter("PAGECONTROL_PAGENO")!=null?request.getParameter("PAGECONTROL_PAGENO"):String.valueOf(1)%>,<%=request.getParameter("PAGECONTROL_STARTPAGE")!=null?request.getParameter("PAGECONTROL_STARTPAGE"):String.valueOf(1)%>);
			</script>
			其中<MM:BeginLock translatorClass="MM_JSPSCRIPT" type="script" depFiles="" orig="%3C%25=recordCount%25%3E" ><MM_JSPSCRIPT><MM:EndLock>和<MM:BeginLock translatorClass="MM_JSPSCRIPT" type="script" depFiles="" orig="%3C%25=pageSize%25%3E" ><MM_JSPSCRIPT><MM:EndLock>是从后台得到的记录总数以及每页显示记录数,可能是按以下方式获得(测试时可用常量代替):
				pageInfo.getString("totalRecord")以及pageInfo.getString("everyPageRecord")
			指定后面的两个参数的代码是用来处理提交的页码和当前组的起始页码的,无须更改.
		c.存放在pageNoElementName元素中的当前页码可以作为请求的页码传递给后台	--change 2001-04-17
	2.自行控制元素内容和样式
		a.写一个类似如下所示的函数:
			function myDrawPanel(recordCount,pageSize,pageNo,startPage)
			{
				//在页面没有提供Form时,指定自行创建Form,请慎用此域
				pageControl.useForm=true;
				//当页码很多时,指定每组显示的页码数(-1显示所有页码).
				pageControl.groupSize=12;
				//可以根据后台程序的要求改变需要提交的页码的元素名称.	--new 2001-04-17
				pageControl.pageNoElementName="PAGENO";			--new 2001-04-17
				//更改控制元素内容,可以使用<img ...>等标记.参见对象说明中Fields/textStrs的有关内容
				pageControl.setTextStrs(new Array("Prior Page","&lt;&lt;","&gt;&gt;","Next Page"));
				//用定义好的样式类指定元素的样式(如:<style type="text/css">.s1{background-color:#FF0000; color=#FFFFFF}</style>),
				//参见对象说明中Fields/styleClasses的有关内容
				pageControl.setStyleClasses(new Array("s1","",""));
				//调用pageControl对象的对应方法
				pageControl.drawText(recordCount,pageSize,pageNo,startPage);

		//注:pageControl对象已经创建,不需要再做创建操作

			}
		b.按1中的描述操作,将函数名称pageControlDrawText换成前面定义的函数名myDrawPanel即可
	3.需要在提交页码之前处理自定义的事件时，可以按以下两种方式中任何一种处理：--added 2001-04-18
		a.写一个事件句柄函数，如：
			function aHandler()
			{
				alert("Triggered!");
				//do sth. else....
			}
			然后按以下方式调用pageControlDrawText（缺省方式）：
				pageControlDrawText(recordCount,pageSize,pageNo,startPage,aHandler);
			或pageControl.drawText（自行控制）：
				pageControl.drawText(recordCount,pageSize,pageNo,startPage,aHandler);
		b.直接在函数参数中书写事件句柄：
			按以下方式调用pageControlDrawText（缺省方式）：
				pageControlDrawText(recordCount,pageSize,pageNo,startPage,function(){alert("Triggered!");//do sth. else....});
			或pageControl.drawText（自行控制）：
				pageControl.drawText(recordCount,pageSize,pageNo,startPage,function(){alert("Triggered!");//do sth. else....});
*/

var pageControl = new PageControl();
function PageControl()
{
//public fields
	this.useForm = false;
	this.groupSize = 10;
	this.pageNoElementName = "PAGENO";		//--added 2001-04-17		
	this.onPageChange = null;				//--added 2001-04-18
	this.hostForm = null;					//--added 2001-04-19
//private fields
	this.textStrs = new Array("前一页","&lt;&lt;","&gt;&gt;","后一页");
	this.styleClasses = new Array("","","");//page nav,group nav,page no
//public methods
	this.setTextStrs = setTextStrs;
	this.setStyleClasses = setStyleClasses;
	this.drawText = drawPageControlPanel;
	this.reset = pgReset;

	return this;
}
function setTextStrs(aryStr)
{
	this.textStrs = aryStr;
}
function setStyleClasses(aryClass)
{
	this.styleClasses = aryClass;
}
function drawPageControlPanel(recordCount,pageSize,pageNo,startPage,pageChangeHandler)
{
	this.onPageChange = pageChangeHandler;
	if(pageSize<=0)pageSize=1;
	var totalPage=Math.ceil(recordCount/pageSize);
	if(pageNo==-1||pageNo>totalPage){
		pageNo=1;
		startPage=1;
	}
	if(this.groupSize<=0)this.groupSize=totalPage;
	var str= "";

    if(pageNo==1){
        //str+="<span class='"+this.styleClasses[0]+"'>"+this.textStrs[0]+"</span>";//prior page
    }
    else{
        str+="<a href='javascript:goPage("+(pageNo-1)+")' class='"+this.styleClasses[0]+"'>"+this.textStrs[0]+"</a>";//prior page
    }
    if(startPage>this.groupSize){
        str+="&nbsp;<a href='javascript:fetchNextGroup("+(startPage-this.groupSize)+")' class='"+this.styleClasses[1]+"'>"+this.textStrs[1]+"</a>";//prior group
    }
    var cnt=0;
    for(i=startPage;i<=totalPage&totalPage>1;i++){
	if(i==pageNo)
	    str+="&nbsp;<b><span class='"+this.styleClasses[2]+"'>"+i+"</span></b>";
	else	   
	    str+="&nbsp;<a href='javascript:goPage("+i+")' class='"+this.styleClasses[2]+"'>"+i+"</a>";
	if(++cnt>=this.groupSize&&i<totalPage){
	    str+="&nbsp;<a href='javascript:fetchNextGroup("+(startPage+this.groupSize)+")' class='"+this.styleClasses[1]+"'>"+this.textStrs[2]+"</a>";//next group
	    break;
	}
    }
    if(pageNo>=totalPage){
        //str+="&nbsp;<span class='"+this.styleClasses[0]+"'>"+this.textStrs[3]+"</span>";//next page
    }
    else{
        str+="&nbsp;<a href='javascript:goPage("+(pageNo+1)+")' class='"+this.styleClasses[0]+"'>"+this.textStrs[3]+"</a>";
    }
    /* added by mark cai 2005-08-15 start */
 if( totalPage > 1){
    str += "<input type='input' size='5' name='PAGENO_GO' onkeypress='numberOnlyPage(); _setCurrPage(this.value);' >"
    str += "<input type='button' onclick='checkAndGoPage(document.all(\"PAGENO_GO\").value, "+ totalPage +" );' value='go'>"
 }
    /* added by mark cai 2005-08-15 end */

    str+="<input type='hidden' name='PAGECONTROL_TESTFORM'>"
    
    
 document.write(str);
 
 if (this.useForm){
 	document.write("<form name='frmPageControl' action='' method='POST'></form>");
	this.hostForm = document.frmPageControl;
 }
 str="";
 str+="<br><input type='hidden' name='PAGECONTROL_PAGENO' value='-1'>";  //-1表示从pageControl之外的元素提交了Form. 2001-04-19
 str+="<input type='hidden' name='PAGECONTROL_STARTPAGE' value='"+startPage+"'>";  
 str+="<input type='hidden' name='"+this.pageNoElementName+"' value='1'>";  //"+pageNo+"--added 2001-04-17
 
 if(this.hostForm!=null&&this.hostForm!=document.all("PAGECONTROL_TESTFORM").form)
 	this.hostForm.innerHTML += str;
 else
 	document.write(str);	
}

function checkAndGoPage(pageNumber, totalPage1){
  if(checkUpAndDownPage(pageNumber,1,totalPage1)){
    goPage(pageNumber);
  }else{
    document.all("PAGENO_GO").value = totalPage1;
    document.all("PAGENO_GO").focus;
  }
}

function pgReset()
{
	document.all("PAGECONTROL_PAGENO").value="";
	document.all("PAGECONTROL_STARTPAGE").value="";
	document.all(this.pageNoElementName).value="";
}


/*****Utility Functions*****/
/*
Function:	提交当前页面,包含请求的页码,绑定在页码控制元素的超链接(或onClick事件)
Parameters:	pageNo		--当前页码
Return:		none
Last Update:2001-04-17
*/
function goPage(pageNo)
{
    var frm = document.all("PAGECONTROL_PAGENO").form;
	frm.PAGECONTROL_PAGENO.value=pageNo;
    frm.PAGECONTROL_STARTPAGE.value=Math.floor((pageNo-1)/pageControl.groupSize)*pageControl.groupSize+1;
	frm.all(pageControl.pageNoElementName).value = pageNo;		//--new 2001-04-17
	if(assigned(pageControl.onPageChange))pageControl.onPageChange();
    frm.submit();
}
/*
Function:	提交当前页面,包含请求的页码,绑定在组控制元素的超链接(或onClick事件)
Parameters:	startPage	--当前组的起始页码
Return:		none
Last Update:2001-04-17
*/
function fetchNextGroup(startPage)
{
    var frm = document.all("PAGECONTROL_PAGENO").form;
    frm.PAGECONTROL_PAGENO.value=startPage;
    frm.PAGECONTROL_STARTPAGE.value=startPage;
	frm.all(pageControl.pageNoElementName).value = startPage;		//--new 2001-04-17
	if(assigned(pageControl.onPageChange))pageControl.onPageChange();
    frm.submit();
}

function assigned(eventName)
{
	if(eventName!=null)return true;
	else return false;
}

/**
 *	只能输入数字
 */
function numberOnlyPage() // onkeypress event
{
  var key = window.event.keyCode;  

  if(( key > 47 && key < 58)||key==13 ) 
	  window.event.returnValue = true;
  else {
	  window.event.returnValue = false;
	  alert("只能输入数字.");
  }
}

/**
 *	判断是否某个数值value是否在指定的范围[min，max]之内
 *  参数：
 *		value	需判断的数值
 *		min		最小值
 *		max		最大值
 */
function checkUpAndDownPage(value,min,max)
{
	if((value>=min)&&(value<=max))
		return true;
	else{
   	    alert('范围必须在' + min +'~' + max +'之间！');
		return false;
    }
		
}

/*
Function:	公共函数,按缺省方式产生所有控制元素
Parameters:	recordCount		--共有记录总数
			pageSize		--每页显示的记录数
			pageNo			--当前页码
			startPage		--当前页码组的起始页码
			pageChangeHandler--改变当前页码时触发的时间句柄(可选)		//added 2001-04-18
Return:		none
Last Update:2001-04-19
*/
function pageControlDrawText(recordCount,pageSize,pageNo,startPage,pageChangeHandler)
{
	pageControl.drawText(recordCount,pageSize,pageNo,startPage,pageChangeHandler);
}



/*****Utility Functions*****/
/*
Function:	设置当前页数
Last Update:2006-08-18
Author: ken kok
*/
function _setCurrPage(value)
{
    var frm = document.all("PAGECONTROL_PAGENO").form;
	frm.PAGECONTROL_PAGENO.value=value;
	frm.all(pageControl.pageNoElementName).value=value;
}
