﻿(function($) {
    $.fn.pager = function(options) {
	
        var opts = $.extend({}, $.fn.pager.defaults, options);
		if(options.pagecount>1){
        return this.each(function() {

        // empty out the destination element and then render out the pager with the supplied options
            $(this).empty().append(renderpager(parseInt(options.pagenumber), parseInt(options.pagecount), options.buttonClickCallback, parseInt(options.limit)));
            
        });}
    };
	
    // render and return the pager with the supplied options
    function renderpager(pagenumber, pagecount, buttonClickCallback, limit) {

        // setup $pager to hold render
        var $pager = $('<ul class="pages"></ul>');

        // add in the previous and next buttons
        $pager.append(renderButton('Primeiro', pagenumber, pagecount, buttonClickCallback, 1)).append(renderButton('Anterior', pagenumber, pagecount, buttonClickCallback, pagenumber - 1));

        // pager currently only handles 10 viewable pages ( could be easily parameterized, maybe in next version ) so handle edge cases
        var startPoint = 1;
        var endPoint = limit;
		var mediunPoint = Math.floor(endPoint/2);

        if (pagenumber > mediunPoint) {
            startPoint = pagenumber - mediunPoint;
            endPoint = pagenumber + mediunPoint;
        }

        if (endPoint >= pagecount) {
            startPoint = pagecount-limit+1 ;
            endPoint = pagecount;
        }

        if (startPoint < 1) {
            startPoint = 1;
        }

        // loop thru visible pages and render buttons
        for (var page = startPoint; page <= endPoint; page++) {

            var currentButton = $('<li class="page-number">' + (page) + '</li>');

            page == pagenumber ? currentButton.addClass('pgCurrent') : currentButton.click(function() { buttonClickCallback(this.firstChild.data); });
            currentButton.appendTo($pager);
        }

        // render in the next and last buttons before returning the whole rendered control back.
        $pager.append(renderButton('Próximo', pagenumber, pagecount, buttonClickCallback, pagenumber + 1)).append(renderButton('Último', pagenumber, pagecount, buttonClickCallback, pagecount));

        return $pager;
    }

    // renders and returns a 'specialized' button, ie 'next', 'previous' etc. rather than a page number button
    function renderButton(buttonLabel, pagenumber, pagecount, buttonClickCallback, destPage) {

        var $Button = $('<li class="pgNext">' + buttonLabel + '</li>');
		
        // disable and 'grey' out buttons if not needed.
		if(destPage==pagenumber || destPage<1 || destPage>pagecount ){
			$Button.addClass('pgEmpty');
		}else{
			$Button.click(function() { buttonClickCallback(destPage);});
		}
        return $Button;
    }
})(jQuery);