﻿
var SimplePaginator = Class.create({
	initialize: function(pagilist, options)
	{
        this.pagiList   = pagilist;
		this.pagiItems  = this.pagiList.childElements();
		this.itemCount  = this.pagiItems.size();
		// set options
		this.options = Object.extend(
		{
			initialPageIndex: 0,
			itemsPerPage: 10,
			disabledClassName: 'disabled',
			selectedClassName: 'selected'
		}, options || {});
		// init current page
		this.currentPageIndex = this.options.initialPageIndex;

		this.pages = this.pagiItems.eachSlice(this.options.itemsPerPage);
		this.pageCount = this.pages.size();
		if (this.pageCount == 1) {return;} // only one page, no pagination needed

		// add div.paginav controls
		//var elBottomControls = new Element('div', {id: 'lowerpaginav', 'class': 'paginav'}); //CN: customize for blog
		var elBottomControls = new Element('div', {id: 'lowerpaginav', 'class': 'blognav'}).insert({bottom: '<div class="clear"></div>'});
		this._addControlList(elBottomControls);
		this.pagiList.insert({after: elBottomControls});
		this.paginavBottom = elBottomControls;
		this.viewPage(this.currentPageIndex);
	},

	// creates a ul filled with pagination links, attaches an event listener, and appends the node to supplied element.
	_addControlList: function(elDiv){

		var elControlList = new Element('ul');

			var elPrevNavItem = new Element('li', {'class': 'prev'});
				var elPrevNavLink = new Element('a', {'href': '#prev', 'class': 'lnk-prev'}).update('Next Page');
				elPrevNavItem.insert(elPrevNavLink);
			elControlList.insert(elPrevNavItem);

			var elNextNavItem = new Element('li', {'class': 'next'});
				var elNextNavLink = new Element('a', {'href': '#next', 'class': 'lnk-next'}).update('Previous Entries');
				elNextNavItem.insert(elNextNavLink);
			elControlList.insert(elNextNavItem);

		// add event handler
		elControlList.observe('click', this.__paginavListClick.bindAsEventListener(this));
		// add new nodes to li
		elDiv.insert({top: elControlList});
	},

	// calls updatePaginav on both top and bottom nav
	updatePaginavs: function()
	{
		this.updatePaginav(this.paginavBottom);
	},

	// sets disabled and selected classes
	updatePaginav: function(elPaginav)
	{
		// adjust next/previous
		var elPrevNavItem = elPaginav.down('li.prev');
		(this.currentPageIndex > 0) ? elPrevNavItem.removeClassName(this.options.disabledClassName) : elPrevNavItem.addClassName(this.options.disabledClassName);

		var elNextNavItem = elPaginav.down('li.next');
		(this.currentPageIndex < (this.pageCount-1)) ? elNextNavItem.removeClassName(this.options.disabledClassName) : elNextNavItem.addClassName(this.options.disabledClassName);
	},

	__paginavListClick: function(e)
	{
		var el = e.element();
		var elLi, elLnk;
		if (el.nodeName == 'UL') {return;}
		e.stop();

		if (el.nodeName != 'LI') {elLi = $(el).up('li');}
		else {elLi = $(el);}
		elLnk = elLi.down('a');

		var dest = elLnk.hash.replace('#', '');
		switch(dest){
			case 'prev':
				this.viewPreviousPage();
				break;
			case 'next':
				this.viewNextPage();
				break;
			default:
				var pageIndex = /\d+$/.exec(dest)[0];
				this.viewPage((parseInt(pageIndex))-1);
				break;
		}
	},

	viewNextPage: function()
	{
		if (this.currentPageIndex < (this.pageCount-1))
		{
			this.viewPage(this.currentPageIndex + 1);
		}
	},
	viewPreviousPage: function()
	{
		if (this.currentPageIndex > 0)
		{
			this.viewPage(this.currentPageIndex - 1);
		}
	},
	viewPage: function(pageIndex)
	{
	    this.currentPageIndex = pageIndex;
	    this.pagiItems.invoke('hide');
	    this.pages[this.currentPageIndex].invoke('show');
		this.updatePaginavs();
		$('top').scrollTo();
	}
});

