/**
 *
 * Updated: 04/11/2009
 * --------------------
 * + Multiple navigations on the same page is now support - Max.
 *
 * 	Usage example:
 * 	=============
 *$( function() {
 *
 *	var pagination = jPagination.init ( { 	containers : { // HTML Elements - Wrapped in jQuery(!)
 *	 							first : $('.first'), back : $('.back'), pagination : $('.pagination'),
 *	 							next : $('.next'), last : $('.last')
 *	 						},
 *	 						pagination : { // Integers
 *	 							recordsNum : 100, recordsPerPage : 10,
 *	 							pagesToShow : 5
 *	 						},
 *	 						callbacks : { // Callbacks
 *	 						onChange : blah
 *	 						}
 *	 					});
 *
 * });
 *
 *  blah = function(e, limitStart, limitOffset, pageNum) {
 *	alert('limitStart : ' + limitStart + '\n' +
 *		  'limitOffset : ' + limitOffset + '\n' +
 *		  'pageNum : ' + pageNum + '\n'
 *		  );
 *
 *
 * Usage of the reutrned object:
 * =============================
 * var numPages = pagination.numPages; // gets number of pages
 * pagination.navigateTo(3); // goes to page 3
 *
 *
 */

var jPagination = {

	/* Default config : */
	defaults : {
			strings : {		// Strings
				first : '<<', 		// 'First page' string
				back : '<',			// 'Back page' 	string
				next : '>',			// 'Next page' 	string
				last : '>>',		// 'Last page' 	string
				seperator : ','		// Seperator 	string
			},
			pagination : {	// Pagination settings
				pagesToShow : 10,
				defaultPage : 1
			}
	},

    /** Initiates jPagination
	 *
	 *	config : object { 	containers : { // HTML Elements - Wrapped in jQuery(!)
	 *							next, last ,
	 * 						},
	 *						pagination : { // Integers
	 * 							recordsNum, recordsPerPage,
	 * 							pagesToShow
	 * 						},
	 *						callbacks : { // Callbacks
	 * 						onChange(event, limitStart, limitOffset, pageNum)
	 *								// this = anchor element wrapped with jQuery
	 * 						}
	 * 					} // You can also change the defaults.
	 *
     *
     *
	 */
	init : function( config ) {

        return new jPagination.__construct(config);



	}, // end init()

    __construct: function (config) {
        var config = $.extend( true, {}, jPagination.defaults, config );
        config.pagination.numPages = Math.ceil( config.pagination.recordsNum /
            									config.pagination.recordsPerPage );

		var currentPage = config.pagination.defaultPage;

		var onChange = function(event) {

			var obj = $(this);

			if (event.data.page) {
				currentPage = event.data.page;
			} else if (event.data.pageOffset) {
				currentPage += event.data.pageOffset;
            }

			if (currentPage > config.pagination.numPages) {
				currentPage = config.pagination.numPages;
            }

			if (currentPage < 1) {
				currentPage = 1;
            }

			config.callbacks.onChange.apply(obj, [ event, (currentPage - 1)* config.pagination.recordsPerPage,
													config.pagination.recordsPerPage,
													(currentPage) ] );

			drawPagination();
			return false;
		};

		var drawPagination = function() {

			var eachSide = Math.round(config.pagination.pagesToShow/2);

			var firstPage = Math.min(
								Math.max(1, currentPage - eachSide + 1),
								config.pagination.numPages - eachSide - 1
								);
			var lastPage = firstPage + config.pagination.pagesToShow - 1;

			if(lastPage > config.pagination.numPages)
				lastPage =  config.pagination.numPages

			if(firstPage < 1)
				firstPage = 1;


			config.containers.pagination.empty();

			for (var cPage = firstPage; cPage <= lastPage; cPage++) {
					var link = $(document.createElement('a'))
								.attr( {'href':'#', 'rel':cPage})
								.text(cPage)
								.appendTo(config.containers.pagination)
								.bind('click', { page : cPage }, onChange);

					if (cPage === currentPage)
						link.addClass('selected');

					if (cPage !== lastPage)
						$(document.createTextNode(' ' + config.strings.seperator + ' '))
						.appendTo(config.containers.pagination);

			}

		};

		var drawExtraPagination = function() {

			if (config.containers.first.size() > 0) {
				$(document.createElement('a'))
				.append(config.strings.first)
				.appendTo(config.containers.first)
				.bind('click', { page : 1 }, onChange );
			}

			if (config.containers.back.size() > 0) {
				$(document.createElement('a'))
				.append(config.strings.back)
				.appendTo(config.containers.back)
				.bind('click',  { pageOffset : -1 }, onChange);
			}

			if (config.containers.next.size() > 0) {
				$(document.createElement('a'))
				.append(config.strings.next)
				.appendTo(config.containers.next)
				.bind('click', { pageOffset : 1 }, onChange);
			}

			if (config.containers.last.size() > 0) {
				$(document.createElement('a'))
				.append(config.strings.last)
				.appendTo(config.containers.last)
				.bind('click', { page : config.pagination.numPages }, onChange);
			}

		};

		drawExtraPagination();
		drawPagination();

        this.prototype = {

			numPages : config.pagination.numPages,
            navigateTo: function(pageNum) {
                config.containers.pagination.find('a[rel=' + pageNum + ']').click();
            }

		};  // end this.prototype{}

    } // end __construct()
};

