function LxCustomPager(ModuleId)
{
   this.ModuleId = ModuleId;
   this.listeners = new Array();
   this.leftImageOn;
   this.leftImageOff;
   this.rightImageOn;
   this.rightImageOff;
   this.spacerImage;
   this.htmltemplate = "";
   this.pagerCssClass = "PagerCss"+ModuleId;
   this.titleFilterList = new Array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','0-9');
   this.titleFilterFormField = "TitleFilter"+ModuleId;
   this.defaultOn = "false";
   this.getCurrentPage = function() { return eval("CURRENTPAGE"+ModuleId); }
   this.getResultsCount = function() { return eval("DATALENGTH"+ModuleId); }
   this.getResultsPerPage = function() { return eval("RPP"+ModuleId); }
   this.pagerStateFieldId = "PagerState"+ModuleId;
   this.pagerStartPagePosId = "PagerStartPagePos";
   this.pagerPageNoCount = 5;
}

LxCustomPager.prototype.RunUpdatePaging = function ()
{
  var tableHTML = this.buildHTML();
  var myDiv;
  for (var i=0;i<this.listeners.length;i++)
  {
    myDiv = document.getElementById(this.listeners[i]);
    if (tableHTML.length>0)
    {
	   if (myDiv&&myDiv.style)
	   {
		   myDiv.style.display = "block";
	   }
    }
    else
    {
	   if (myDiv&&myDiv.style)
	   {
		   myDiv.style.display = "none";
	   }
    }
	if (myDiv)
	{
		myDiv.innerHTML = tableHTML;
	}
  }
}


LxCustomPager.prototype.getPagerState = function()
{
   var pagerStateItem = document.getElementById(this.pagerStateFieldId);
   if (this.getResultsPerPage()==0)
   {
	   // we should hide the pager if there are no results per page
	   return false;
   }
   else if (pagerStateItem && pagerStateItem.value.toLowerCase()=="true")
   {
	   return true;
   }
   else if (pagerStateItem && pagerStateItem.value.toLowerCase()=="false")
   {
	   return true;
   }
   return this.defaultOn.toLowerCase()=="true";
}

LxCustomPager.prototype.updatePaging = function()
{
  // first, we load our listeners
  this.loadListeners(this.pagerCssClass);
  
  // then we setup this function redirect new function
  this.updatePaging = this.RunUpdatePaging;
  // finally, we call the new function
  this.RunUpdatePaging();

  // this function never be called again
}

LxCustomPager.prototype.loadListeners = function(className)
{
  this.listeners.length = 0;
  var els = getElementsByClassName(className);
  for (i=0;els&&i<els.length;i++)
  {
	 if (els[i].tagName!="SELECT"&&els[i].tagName!="TABLE"&&els[i].tagName!="TR")
	 {
        this.listeners.push(els[i].id);
	 }
  }
}

LxCustomPager.prototype.buildHTML = function ()
{
	var tableHTML = this.htmltemplate;
	// if there are no results, hide the paging
	//if (this.getResultsCount()==0)
	if (!this.getPagerState())
	{
	   return "";
	}
	var rpp = this.getResultsPerPage();
	//alert(rpp);
	if (!rpp || rpp == 0)
	{
		rpp = 1;
	}
	var totalPages = Math.ceil(this.getResultsCount()/rpp);
	var pageOptions = "";
	var isItemSelected = "";
	for (var i=0;i<totalPages;i++)
	{
	   if (i==this.getCurrentPage())
	   {
		  isItemSelected = " selected=\"selected\" ";
	   }
	   else
	   {
		  isItemSelected = "";
	   }
	   pageOptions += '<option value="'+ i + '"'+isItemSelected+'>' + (i+1) + '</option>\n';
	}
	var leftImageToDisplay;
	var leftImageOnClick;
	if (this.getCurrentPage()==0)
	{
	   leftImageToDisplay = this.leftImageOff;
	   leftImageOnClick = "";
	}
	else
	{
	   leftImageToDisplay = this.leftImageOn;
	   leftImageOnClick = "onclick=\"lxFetch("+this.ModuleId+"," + (this.getCurrentPage()-1) + ",'');\"";
	}
	var rightImageToDisplay;
	var rightImageOnClick;
	if ((this.getCurrentPage()+1)==totalPages)
	{
	   rightImageToDisplay = this.rightImageOff;
	   rightImageOnClick = "";
	}
	else
	{
	   rightImageToDisplay = this.rightImageOn;
	   rightImageOnClick = "onclick=\"lxFetch("+this.ModuleId+"," + (this.getCurrentPage()+1) + ",'');\"";
	}
	if (this.getResultsCount() == 0)
	{
		return "";
	}
	//calculate the figures for the records being displayed
	var cp = this.getCurrentPage();
//	if (cp == 0)
//	{
//		cp = 1;
//	}
	cp = cp + 1;
	var stVal = ((cp - 1) * rpp) + 1;
	var endVal = (cp * rpp);
	if (endVal > this.getResultsCount())
	{
		endVal = this.getResultsCount();
	}
	//done calculation
	tableHTML = tableHTML.replace(/ITEMCOUNT/, this.getResultsCount())
	tableHTML = tableHTML.replace(/STARTRECORD/, stVal);
	tableHTML = tableHTML.replace(/ENDRECORD/, endVal);
//	tableHTML = tableHTML.replace(/PAGECOUNT/, totalPages);
	tableHTML = tableHTML.replace(/MODULEID/, this.ModuleId);
	tableHTML = tableHTML.replace(/PAGENOOPTIONS/, this.buildPageNumbers());
	// add pages to dropdown
//	tableHTML = tableHTML.replace(/PAGEOPTIONS/, pageOptions);
	// add foward and back links / disable appropriately
	tableHTML = tableHTML.replace(/LEFTIMGONCLICK/, leftImageOnClick);
	tableHTML = tableHTML.replace(/LEFTIMGPATH/, leftImageToDisplay);
	tableHTML = tableHTML.replace(/RIGHTIMGONCLICK/, rightImageOnClick);
	tableHTML = tableHTML.replace(/RIGHTIMGPATH/, rightImageToDisplay);
//	tableHTML = tableHTML.replace(/TITLEFILTERLIST/, this.buildTitles());
	return tableHTML;
}

LxCustomPager.prototype.buildTitles = function ()
{
	var titlesHtml = "";
	var titleTemplate = "<a href=\"#\" onclick=\"TITLEONCLICK\">TITLENAME</a>&nbsp;</a>";
	for (var i=0;this.titleFilterList && i < this.titleFilterList.length; i++ )
	{
		tf = this.titleFilterList[i];
		titlesHtml += titleTemplate
			.replace(/TITLEONCLICK/, "lxFetch("+this.ModuleId+",0"+ ",'"+this.titleFilterFormField+"="+ tf +"');")
			.replace(/TITLENAME/,tf);

	}
    return titlesHtml;
}

LxCustomPager.prototype.buildPageNumbers = function ()
{
	var pageNoHTML = "";
	var pageNoTemplate = "<a href=\"#\" onclick=\"PAGEONCLICK\">PAGENAME</a> | ";
	var pageNoTemplate2 = "PAGENAME | ";
	var rpp = this.getResultsPerPage();
	if (!rpp || rpp == 0)
	{
		rpp = 1;
	}
	var totalPages = Math.ceil(this.getResultsCount()/rpp);
	if (this.getResultsCount() == 0)
	{
		return "";
	}
	//alert(totalPages);
	//alert(this.getResultsCount());
//	if ((totalPages * rpp) > this.getResultsCount())
//	{
//		totalPages = totalPages + 1;
//	}
	var cp = this.getCurrentPage();
//	if (cp == 0)
//	{
//		cp = 1;
//	}
//	alert(this.pagerStartPagePosId);
//	alert(document.getElementById(this.pagerStartPagePosId).value);
    var pagerStartPagePos = document.getElementById(this.pagerStartPagePosId).value;
	if (pagerStartPagePos == '' || pagerStartPagePos < 0 )
	{
		pagerStartPagePos = 0;
	}
//	alert(pagerStartPagePos);
//	alert(totalPages);
	if ((pagerStartPagePos) > 0)
	{
		pageNoHTML += "<a href=\"#\" onclick=\" document.getElementById('" + this.pagerStartPagePosId + "').value=" + (parseInt(pagerStartPagePos) - 1) + ";  lxFetch("+this.ModuleId+"," + (parseInt(cp) - 1) + ",'');  return false;  \">Prev</a>&nbsp;</a> | ";
		pageNoHTML += "<a href=\"#\" onclick=\" document.getElementById('" + this.pagerStartPagePosId + "').value=" + (parseInt(pagerStartPagePos) - parseInt(this.pagerPageNoCount)) + ";  lxFetch("+this.ModuleId+"," + (parseInt(pagerStartPagePos) - parseInt(this.pagerPageNoCount)) + ",''); return false; \">&lt;&lt;</a>&nbsp;</a> | ";
	}
//	alert(this.getCurrentPage());
	for (var i=pagerStartPagePos; i < (parseInt(pagerStartPagePos) + parseInt(this.pagerPageNoCount)) &&  i < totalPages; i++ )
	{
		if (i == parseInt(this.getCurrentPage()) || (parseInt(this.getCurrentPage()) == 0 && i == 0))
		{
			pageNoHTML += pageNoTemplate2.replace(/PAGENAME/,parseInt(i) + 1);
		}
		else
		{
			pageNoHTML += pageNoTemplate
				.replace(/PAGEONCLICK/, " lxFetch("+this.ModuleId+"," + parseInt(i) + ",''); return false; ")
				.replace(/PAGENAME/,parseInt(i) + 1);
		}
	}
	if ((parseInt(pagerStartPagePos) + parseInt(this.pagerPageNoCount)) < totalPages)
	{
		pageNoHTML += "<a href=\"#\" onclick=\" document.getElementById('" + this.pagerStartPagePosId + "').value=" + (parseInt(pagerStartPagePos) + parseInt(this.pagerPageNoCount)) + ";  lxFetch("+this.ModuleId+"," + (parseInt(pagerStartPagePos) + parseInt(this.pagerPageNoCount)) + ",'');  return false;  \">&gt;&gt;</a>&nbsp;</a> | ";
		pageNoHTML += "<a href=\"#\" onclick=\" document.getElementById('" + this.pagerStartPagePosId + "').value=" + (parseInt(pagerStartPagePos) + 1) + ";  lxFetch("+this.ModuleId+"," + (parseInt(this.getCurrentPage()) + 1) + ",'');  return false;  \">Next</a>&nbsp;</a>";
	}
	else
	{
		pageNoHTML = pageNoHTML.substring(0,pageNoHTML.length - 2);
	}
//	alert(pageNoHTML);
    return pageNoHTML;
//document.getElementById(" + this.pagerStartPagePosId + ").value=" + (i+1) + "; 
}

function getElementsByClassName(className, tag, elm){
	var testClass = new RegExp("(^|\\s)" + className + "(\\s|$)");
	var tag = tag || "*";
	var elm = elm || document;
	var elements = (tag == "*" && elm.all)? elm.all : elm.getElementsByTagName(tag);
	var returnElements = [];
	var current;
	var length = elements.length;
	for(var i=0; i<length; i++){
		current = elements[i];
		if(testClass.test(current.className)){
			returnElements.push(current);
		}
	}
	return returnElements;
}
