function virtualpaginate(className, chunksize, elementType)
{
	var elementType=(typeof elementType=="undefined")? "div" : elementType
	this.pieces=virtualpaginate.collectElementbyClass(className, elementType)
	this.chunksize=(typeof chunksize=="undefined")? 1 : (chunksize>0 && chunksize <this.pieces.length)? chunksize : this.pieces.length
	this.pagecount=Math.ceil(this.pieces.length/this.chunksize) //calculate number of "pages" needed to show the divs
	this.showpage(-1)
	this.currentpage=0
	this.showpage(this.currentpage)
}

virtualpaginate.collectElementbyClass=function(classname, element)
{
	var classnameRE=new RegExp("(^|\\s+)"+classname+"($|\\s+)", "i") 
	var pieces=[]
	var alltags=document.getElementsByTagName(element)
	for (var i=0; i<alltags.length; i++)
	{
		if (typeof alltags[i].className=="string" && alltags[i].className.search(classnameRE)!=-1)
			pieces[pieces.length]=alltags[i]
	}
	return pieces
}

virtualpaginate.prototype.showpage=function(pagenumber)
{
	var totalitems=this.pieces.length
	var showstartindex=pagenumber*this.chunksize
	var showendindex=showstartindex+this.chunksize-1
	for (var i=0; i<totalitems; i++)
	{
		if (i>=showstartindex && i<=showendindex)
			this.pieces[i].style.display="block"
		else
			this.pieces[i].style.display="none"
	}
	this.currentpage=parseInt(pagenumber)
	if (this.cpspan)	
		this.cpspan.innerHTML='Page '+(this.currentpage+1)+'/'+this.pagecount
}

virtualpaginate.prototype.paginate_build_selectmenu=function(paginatedropdown, anchortext)
{
	var instanceOfBox=this
	var anchortext=anchortext || new Array()
	this.selectmenupresent=1
	for (var i=0; i<this.pagecount; i++)
	{
		if (typeof anchortext[i]!="undefined")
			paginatedropdown.options[i]=new Option(anchortext[i], i)
		else 
			paginatedropdown.options[i]=new Option("Page "+(i+1)+" of "+this.pagecount, i)
	}
	paginatedropdown.selectedIndex=this.currentpage
	paginatedropdown.onchange=function()
	{
		instanceOfBox.showpage(this.selectedIndex)
	}
}

virtualpaginate.prototype.paginate_build_regularlinks=function(paginatelinks)
{
	var instanceOfBox=this
	for (var i=0; i<paginatelinks.length; i++)
	{
		var currentpagerel=paginatelinks[i].getAttribute("rel")
		if (currentpagerel=="previous" || currentpagerel=="next" || currentpagerel=="first" || currentpagerel=="last")
			paginatelinks[i].onclick=function()
			{
				instanceOfBox.navigate(this.getAttribute("rel"))
				return false
			}
	}
}

virtualpaginate.prototype.paginate_build_flatview=function(flatviewcontainer, anchortext)
{
	var instanceOfBox=this
	var flatviewhtml=""
	var anchortext=anchortext || new Array()
	for (var i=0; i<this.pagecount; i++)
	{
		if (typeof anchortext[i]!="undefined") 
			flatviewhtml+='<a href="#flatview" rel="'+i+'">'+anchortext[i]+'</a> '
		else
			flatviewhtml+='<a href="#flatview" rel="'+i+'">'+(i+1)+'</a> ' 
	}
	flatviewcontainer.innerHTML=flatviewhtml
	this.flatviewlinks=flatviewcontainer.getElementsByTagName("a")
	for (var i=0; i<this.flatviewlinks.length; i++)
	{
		this.flatviewlinks[i].onclick=function()
		{
			instanceOfBox.flatviewlinks[instanceOfBox.currentpage].className="" 
			this.className="selected" 
			instanceOfBox.showpage(this.getAttribute("rel"))
			return false
		}
	}
	this.flatviewlinks[this.currentpage].className="selected" 
	this.flatviewpresent=true
}

virtualpaginate.prototype.paginate_build_cpinfo=function(cpspan)
{
	this.cpspan=cpspan
	cpspan.innerHTML='Page '+(this.currentpage+1)+'/'+this.pagecount
}

virtualpaginate.prototype.buildpagination=function(divid, optnavtext)
{
	var instanceOfBox=this
	var paginatediv=document.getElementById(divid)
	if (this.chunksize==this.pieces.length)
	{ 
		paginatediv.style.display="none"
		return
	}
	var paginationcode=paginatediv.innerHTML 
	if (paginatediv.getElementsByTagName("select").length>0) 
	this.paginate_build_selectmenu(paginatediv.getElementsByTagName("select")[0], optnavtext)
	if (paginatediv.getElementsByTagName("a").length>0) 
	this.paginate_build_regularlinks(paginatediv.getElementsByTagName("a"))
	var allspans=paginatediv.getElementsByTagName("span") 
	for (var i=0; i<allspans.length; i++)
	{
		if (allspans[i].className=="flatview")
			this.paginate_build_flatview(allspans[i], optnavtext)
		else if (allspans[i].className=="paginateinfo")
			this.paginate_build_cpinfo(allspans[i])
	}
	this.paginatediv=paginatediv
}

virtualpaginate.prototype.navigate=function(keyword)
{
	if (this.flatviewpresent)
		this.flatviewlinks[this.currentpage].className="" 
	if (keyword=="previous")
		this.currentpage=(this.currentpage>0)? this.currentpage-1 : (this.currentpage==0)? this.pagecount-1 : 0
	else if (keyword=="next")
		this.currentpage=(this.currentpage<this.pagecount-1)? this.currentpage+1 : 0
	else if (keyword=="first")
		this.currentpage=0
	else if (keyword=="last")
		this.currentpage=this.pieces.length-1
	this.showpage(this.currentpage)
	if (this.selectmenupresent)
		this.paginatediv.getElementsByTagName("select")[0].selectedIndex=this.currentpage
	if (this.flatviewpresent)
		this.flatviewlinks[this.currentpage].className="selected" 
}