var ResultPager = Class.create({
	initialize: function(properties) {
		if (properties == undefined) {
			properties = {};
		}
		if (properties.items == undefined) {
			properties.items = [];
		}
		if (properties.itemsPerPage == undefined) {
			properties.itemsPerPage = 5;
		}
		if (properties.clearItems == undefined) {
			properties.clearItems = function() {
			}
		}
		if (properties.displayItem == undefined) {
			properties.displayItem = function(item) {
			}
		}
		
		// Initialize Members
		this.currentPage = 0;
		
		this.items = properties.items;
		this.itemsPerPage = properties.itemsPerPage;
		this.pages = (this.items.length / this.itemsPerPage).ceil();
		this.clearItems = properties.clearItems;
		this.displayItem = properties.displayItem
		
	},
	
	renderPager: function(container, options) {
		if (!$(container)) {
			return;
		}
		if (options == undefined) {
			options = {};
		}
		
		var pager = createExtendedElement('div', {
			className: 'resultpager',
			parent: container
		});
		this.previousButton = createExtendedElement('a', {
			className: 'page previous',
			innerHTML: '<',
			href: '#',
			title: 'Previous Page',
			parent: pager
		});
		this.previousButton.observe('click', this.movePrevious.bindAsEventListener(this));
		
		this.pageMenu = createExtendedElement('span', {
			parent: pager
		});
		this.populatePageMenu();
		
		this.nextButton = createExtendedElement('a', {
			className: 'page next',
			innerHTML: '>',
			href: '#',
			title: 'Next Page',
			parent: pager
		});
		if (this.currentPage + 1 == this.pages) {
			this.nextButton.disabled = true;
		}
		this.nextButton.observe('click', this.moveNext.bindAsEventListener(this));
		
		createExtendedElement('div', {
			className: 'clear',
			parent: pager
		});
	},
	
	populatePageMenu: function() {
		for (var i = 0; i < this.pages; i++) {
			var jumpToPage = createExtendedElement('a', {
				className: 'page',
				innerHTML: i + 1,
				href: '#',
				title: 'Page ' + (i + 1),
				parent: this.pageMenu
			});
			jumpToPage.observe('click', function(event) {
				Event.element(event).blur();
				Event.stop(event);
				this.moveToPage(Event.element(event).innerHTML - 1);
			}.bindAsEventListener(this));
		}
	},
	
	movePrevious: function(event) {
		if (event != undefined) {
			Event.element(event).blur();
			Event.stop(event);
		}
		if (this.currentPage > 0) {
			this.currentPage--;
			//this.pageMenu.options[this.currentPage].selected = true;
			this.displayItems();
		}
	},
	
	moveNext: function(event) {
		if (event != undefined) {
			Event.element(event).blur();
			Event.stop(event);
		}
		if (this.currentPage < this.pages - 1) {
			this.currentPage++;
			//this.pageMenu.options[this.currentPage].selected = true;
			this.displayItems();
		}
	},
	
	moveToPage: function(page) {
		this.currentPage = page;
		this.displayItems();
	},
	
	displayItems: function() {
		this.pageMenu.select('a').each(function(item) {
			if (item.innerHTML == (this.currentPage + 1)) {
				$(item).addClassName('selected');
			} else {
				$(item).removeClassName('selected');
			}
		}.bind(this));
		if (this.currentPage == 0) {
			this.previousButton.disabled = true;
		} else {
			this.previousButton.disabled = false;
		}
		if (this.currentPage + 1 == this.pages) {
			this.nextButton.disabled = true;
		} else {
			this.nextButton.disabled = false;
		}
		this.clearItems();
		for (var i = 0; i < this.itemsPerPage && (this.itemsPerPage * this.currentPage) + i < this.items.length; i++) {
			this.displayItem(this.items[(this.itemsPerPage * this.currentPage) + i]);
		}
	}
});