//*******************************************************************
// DataListPaging
// Created by: Michael Castillones
//*******************************************************************
// Version History.
//*******************************************************************
// May 28, 2007 Initial Version.
//*******************************************************************
// Revision History :  Fixed IE Memory leaks
// ******************************************************************
// May 30,2007
/***********************************************************************/
// set Constructor parameters:
// Display Element, Total no. of items,, no. of Items displayed, previous button Element, next Button Element, page Status Element
// 
/***********************************************************************/
function PagingElements(pageCount,itmDispCount,prevElem,nextElem,pageStatusElem){
  this.m_itemDispCount = parseInt(itmDispCount);
  this.m_pageCount = parseInt(pageCount);
  this.m_prev = prevElem;
  this.m_next = nextElem;
  this.m_pageStatus = (pageStatusElem) ? pageStatusElem : null;  
}

DataListPaging=function(dispElem,pElem){  
  this.m_pagingElem = pElem; 
  this.m_pageIndex = 0;
  this.m_dataList = new Array();  
  this.m_elemDisp = dispElem;
  this.m_startTag = '';
  this.m_endTag = '';
  this.m_ObjectEvents = new Array();
  this.dispose();  
  this.configurePaging();
}
/***********************************************************************/
/*  Dispose event handler IE issue of memory leaks */
/***********************************************************************/
DataListPaging.prototype.dispose=function(){
  if(this.m_pagingElem.m_prev.onclick)
    this.m_pagingElem.m_prev.onclick = null;
  if(this.m_pagingElem.m_next.onclick)
    this.m_pagingElem.m_next.onclick = null;     
}
/***********************************************************************/
/*  add array of results */
/***********************************************************************/
DataListPaging.prototype.addList=function(pList){
  this.m_dataList = pList;
}
/***********************************************************************/
/* add item of results*/
/***********************************************************************/
DataListPaging.prototype.addItem=function(pItem){
  this.m_dataList.push(pItem);
}
/***********************************************************************/
/* set outerHTML for the array results                                 */
/***********************************************************************/
DataListPaging.prototype.setOuterHTML=function(startTag,endTag){  
  try{
    if(startTag.length>0 != ''&& startTag.length > 0){
      this.m_startTag = startTag;
      this.m_endTag = endTag;
	}
  }catch(e){ return false; }
  return true;
}
/***********************************************************************/
/*                                                                     */
/***********************************************************************/
DataListPaging.prototype.length=function(){
  return this.m_dataList.length;
}
DataListPaging.prototype.getObjectEvent=function(){
  var obj = new Object();
  obj.id = '';
  obj.eventType ='';
  obj.fn = null;
  return obj;
}

DataListPaging.prototype.addObjectEvent=function(objEvent){  
  this.m_ObjectEvents.push(objEvent);
}
DataListPaging.prototype.attachObjectEvents=function(){
  if(this.m_ObjectEvents.length <= 0) return;
  for(var i=0;i<this.m_ObjectEvents.length;i++){  
    elem = ThePortUtils.findChildId(this.m_elemDisp,this.m_ObjectEvents[i].id)	
	//alert(elem);
	if(elem){
	  Event.observe(elem,this.m_ObjectEvents[i].eventType,this.m_ObjectEvents[i].fn);
	  //alert(this.m_ObjectEvents[i].fn);
	  }
  }
}
/***********************************************************************/
/*       Show Results                                                              */
/***********************************************************************/
DataListPaging.prototype.showResult=function(){
  try{        
    //alert(this.m_pagingElem.m_pageCount);
    if(!this.m_dataList) return;
    if(!this.m_pagingElem.m_pageCount) return;
    if(!this.m_pagingElem.m_itemDispCount) return;
    if(this.m_dataList.length<=0) return;
    var result='';	
    var startIndex = this.m_pageIndex * this.m_pagingElem.m_itemDispCount;	
    for(var cnt=startIndex,idx=0;(cnt<this.m_dataList.length) && (cnt<this.m_pagingElem.m_pageCount) && (idx<this.m_pagingElem.m_itemDispCount); cnt++, idx++){	  
      result += this.m_dataList[cnt];
    }	
	if((this.m_startTag.length>0) && this.m_endTag.length>0)
	  result = this.m_startTag + result + this.m_endTag;	  
	this.m_elemDisp.innerHTML = result;
	this.attachObjectEvents();	
    (this.m_pageIndex >= (this.pageCount()-1)) ? this.m_pagingElem.m_next.style.display = 'none' : this.m_pagingElem.m_next.style.display = 'block';	  
    (this.m_pageIndex > 0) ? this.m_pagingElem.m_prev.style.display = 'block' : this.m_pagingElem.m_prev.style.display = 'none';    
	if(this.m_pagingElem.m_pageStatus != null)
		this.m_pagingElem.m_pageStatus.innerHTML = 'Page ' + this.currentPageIndex() + ' of ' + this.pageCount();	
  }catch(e){ alert(e.message) }
}
/***********************************************************************/
/*    Add handlers to paging buttons                        */
/***********************************************************************/
DataListPaging.prototype.configurePaging=function(){
  if((!this.m_pagingElem.m_prev) && (!this.m_pagingElem.m_next)) return;
  try{	
	 var fn = function(e){
	    this.previous();
	  }.bind(this);
	   this.m_pagingElem.m_prev.onclick = fn;	 
    fn = function(e){
		this.next();
	  }.bind(this);
	  this.m_pagingElem.m_next.onclick = fn;	
  }catch(e){ alert(e.message); }
}
/***********************************************************************/
/*                                                                     */
/***********************************************************************/
DataListPaging.prototype.next=function(){	
	try{	 
	  if(this.m_pageIndex<(this.pageCount()-1)) this.m_pageIndex++;	  
	  this.showResult();
	}catch(e){alert(e.message);}
}
/***********************************************************************/
/*                                                                     */
/***********************************************************************/
DataListPaging.prototype.previous=function(){
  if(this.m_pageIndex>0) this.m_pageIndex--;
  this.showResult();
}
/***********************************************************************/
/*                                                                     */
/***********************************************************************/
DataListPaging.prototype.currentPageIndex=function(){
  return this.m_pageIndex + 1;
}
DataListPaging.prototype.setCurrentPageIndex=function(idx){
  this.m_pageIndex = idx;
}
/***********************************************************************/
/*                                                                     */
/***********************************************************************/
DataListPaging.prototype.pageCount=function(){
  if(this.m_dataList.length <= 0) return null;
  if(this.m_pagingElem.m_itemDispCount <= 0) return null;
  return Math.ceil(this.m_dataList.length / this.m_pagingElem.m_itemDispCount);
}
/***********************************************************************/
/*                                                                     */
/***********************************************************************/
DataListPaging.prototype.setDisplayCount=function(count){ 
  this.m_pagingElem.m_itemDispCount = count;
  this.setCurrentPageIndex(0);
}