
if (!window['$hnj'] || !$hnj.registry.included('/scripts/components/pagingcomponent.js')) { 
$hni.components.pagingComponent = function(elementId, numResultsPerPage, activePagePadding, callback, prevText, nextText) {
	var base = new $hni.components.manager(elementId);
	var _numResults, _totalPages, _currentPage;
	
	var buildMarkup = function() {
		var container = $hnj('#' + elementId);
		container.empty();
		container.show();
		writeLink(container, 'Previous', 'onPreviousPageRequested()', prevText, false);
		container.append('<wbr /><span id="' + elementId + 'EllipsisFirst">...</span>');
		for (var i = 1; i <= _totalPages; i++)
		{
			writeLink(container, 'Page' + String(i), 'onPageRequested(\'' + String(i) + '\')', String(i), true);
		}
		container.append('<wbr /><span id="' + elementId + 'EllipsisLast">...</span>');
		writeLink(container, 'Next', 'onNextPageRequested()', nextText, true);
	};
	
	var writeLink = function(container, spanElementIdSuffix, methodCallAsString, text, initSpace) {
		container.append((initSpace ? '<wbr />' : '') +
			'<span id="' + elementId + spanElementIdSuffix + '">' +
			'<a href="#" onclick="$hni.components.manager.get(\'' + elementId + '\').' + methodCallAsString + ';return false;">' + text + '</a>' +
			'</span>');
	};
	
	var setVisibility = function(element, show) {
		if (show) { element.show(); }
		else { element.hide(); }
	};
	
	return $hnj.extend(
		base,
		{
			init: function(numResults, currentPage) {
				_numResults = numResults;
				_totalPages = Math.ceil(numResults / numResultsPerPage);
				if (_totalPages <= 1) {
					_currentPage = 1;
					var container = $hnj('#' + elementId);
					container.empty();
					container.hide();
					return;
				}
				_currentPage = currentPage;
				buildMarkup();
				this.gotoPage(currentPage);
			},
			onPageRequested: function(page) {
				page = Number(page);
				if (_numResults == 0 || page < 1 || page > _totalPages) {
					return;
				}
				callback(page);
				this.gotoPage(page);
			},
			onPreviousPageRequested: function() {
				this.onPageRequested(_currentPage - 1);
			},
			onNextPageRequested: function() {
				this.onPageRequested(_currentPage + 1);
			},
			gotoPage: function(page) {
				if (_numResults == 0 || page < 1 || page > _totalPages) {
					return;
				}
				
				$hnj('#' + elementId + 'Page' + String(_currentPage)).removeClass('hni_PagerLinkActive');
				setVisibility($hnj('#' + elementId + 'Previous'), page > 1);
				
				var lowerBound = Math.max(page - activePagePadding, 1);
				var upperBound = Math.min(page + activePagePadding, _totalPages);
				setVisibility($hnj('#' + elementId + 'EllipsisFirst'), lowerBound > 1);
				for (var i = 1; i <= _totalPages; i++) {
					setVisibility($hnj('#' + elementId + 'Page' + String(i)), 
						(i >= lowerBound && i <= upperBound));
				}
				setVisibility($hnj('#' + elementId + 'EllipsisLast'), upperBound < _totalPages);
				
				setVisibility($hnj('#' + elementId + 'Next'), page < _totalPages);
				$hnj('#' + elementId + 'Page' + String(page)).addClass('hni_PagerLinkActive');
				
				_currentPage = page;
			}
		});
};

}
if (window['$hnj']) { $hnj.registry.register('/scripts/components/pagingcomponent.js', false); };


