function getPaginationLinkData(pageNum, totalItems, itemsPerPage, maxLinkBarWidth,
		preferredCurrOffset) {
	var totalPages = Math.ceil(totalItems / itemsPerPage);
	var nextPageNum = totalPages > pageNum ? pageNum + 1 : undefined;
	//var nextPageNum = totalPages > pageNum ? pageNum + 1 : totalPages ;
	var prevPageNum = pageNum > 1 ? pageNum - 1 : undefined;
	//var prevPageNum = pageNum > 1 ? pageNum - 1 : pageNum;

	// current page offset defaults to half of link bar width
	var currOffset = preferredCurrOffset != undefined ? preferredCurrOffset
		: Math.floor((maxLinkBarWidth-1) / 2);

	var minPage = pageNum - currOffset;
	var maxPage = minPage + maxLinkBarWidth - 1;
	if (maxPage > totalPages) {
		maxPage = totalPages;
		minPage = maxPage - maxLinkBarWidth + 1;
	}
	if (minPage < 1) {
		minPage = 1;
		maxPage = minPage + maxLinkBarWidth - 1;
	}
	if (maxPage > totalPages)
		maxPage = totalPages;
	
	return new PaginationLinkData(pageNum, prevPageNum, nextPageNum,
		minPage, maxPage);
}

function PaginationLinkData(currentPageNum, prevPageNum, nextPageNum, numberedPagesStart,
		numberedPagesEnd) {
	this.currentPageNum = currentPageNum;
	this.prevPageNum = prevPageNum;
	this.nextPageNum = nextPageNum;
	this.numberedPagesStart = numberedPagesStart;
	this.numberedPagesEnd = numberedPagesEnd;
	
	function Template(templ) {
	  this.templ = templ;
	  
	  this.evaluate = function(k) {
	     var s = templ;
	     var i = s.indexOf("#{num}");
	     while (i!=-1) {
	
	     	s=s.substring(0,i)+k+s.substring(i+6);
	     	i = s.indexOf("#{num}");
	     }
	    
	     return s;
	  }
	  
	  this.counter = function(k, kk) {
	     var s = this.evaluate(k);
	     var i = s.indexOf("#{end}");
	     while (i!=-1) {
	
	     	s=s.substring(0,i)+kk+s.substring(i+6);
	     	i = s.indexOf("#{end}");
	     }
	     
	     return s;
	  }
	}
	
	function toTemplate(s) {
		return typeof s == 'string' ? new Template(s) : s;
	}

	this.getLinks = function(counterTemplate, currTemplate, prevTemplate, noActivePrevTemplate, nextTemplate, noActiveNextTemplate, otherTemplate) {
		var links = new Array();
		if (counterTemplate!= undefined)
			links.push(toTemplate(counterTemplate).counter(currentPageNum, numberedPagesEnd ));
		if (prevPageNum != undefined && prevTemplate != undefined)
			links.push(toTemplate(prevTemplate).evaluate(prevPageNum));
		if (prevPageNum == undefined && prevTemplate != undefined)
			links.push(toTemplate(noActivePrevTemplate).evaluate(prevPageNum));
		if (numberedPagesStart != undefined && numberedPagesEnd != undefined
				&& nextTemplate != undefined && otherTemplate != undefined) {
			otherTemplate = toTemplate(otherTemplate);
			currTemplate = toTemplate(currTemplate);
			for (var i=numberedPagesStart; i<=numberedPagesEnd; i++) {
				var tpl = i == currentPageNum ? currTemplate : otherTemplate;
				links.push(tpl.evaluate(i));
			}
		}
		if (nextPageNum != undefined && nextTemplate != undefined) {
			links.push(toTemplate(nextTemplate).evaluate(nextPageNum));
		}
		if (nextPageNum == undefined && noActiveNextTemplate!= undefined) {
			links.push(toTemplate(noActiveNextTemplate).evaluate(nextPageNum));
		}
		
		return links;
	};
}

function getStandardPaginationLinks(callbackName, pageNum, totalItems, itemsPerPage,
		maxLinkBarWidth) {
	if (maxLinkBarWidth == undefined)
		maxLinkBarWidth = 7;
	var linkData = getPaginationLinkData(pageNum, totalItems, itemsPerPage, maxLinkBarWidth);
	var link = "javascript:" + callbackName + "(#{num})";
	var links = linkData.getLinks('<li class="counter" >#{num} z #{end} </li>',
			'<li class="selected" ><a href="' + link + '"><span>#{num}</span></a></li>',
			'<li class="prev" ><a title="Poprzednia" href="javascript:void(0);" onclick="' + link + '"><span>Poprzednia</span></a></li>',
			'<li class="prev" ><a title="Poprzednia" href="javascript:void(0);" ><span>Poprzednia</span></a></li>',
			'<li class="next" ><a title="Następna" href="javascript:void(0);" onclick="' + link + '"><span>Następna</span></a></li>',
			'<li class="next" ><a title="Następna" href="javascript:void(0);" ><span>Następna</span></a></li>',
			'<li><a title="#{num}" href="javascript:void(0);" onclick="' + link + '"><span>#{num}</span></a></li>');
	return links;
}

