(function() {
jQuery.fn.pingdomtablepager = function(parameters){
	/**
	 * Default settings
	 */
    var settings = {
        // Events
        pagerCallback : function onPaging(currPage, rowsPerPage){return 1;},
        
        // Defaults
        rowsPerPage : 10,
        currentPage : 1,
        totalRows : 1,
                
        // Pager elements
        numRowsInputId : '#pagerrows',
        startButtonId : '#firstpage',
        backButtonId : '#previouspage',
        nextButtonId : '#nextpage',
        endButtonId : '#lastpage',
        currentPageInputId : '#currentPageInput',
        currentPageLabelId : '#currentpage',
        totalPagesLabelId : '#totalPages',
        
        // Visual settings
        startButtonEnabledClass : 'firstpage',
        backButtonEnabledClass : 'previouspage',
        nextButtonEnabledClass : 'nextpage',
        endButtonEnabledClass : 'lastpage',
        
        startButtonDisabledClass : 'firstpageDisabled',
        backButtonDisabledClass : 'previouspageDisabled',
        nextButtonDisabledClass : 'nextpageDisabled',
        endButtonDisabledClass : 'lastpageDisabled'
    };
    jQuery.extend(settings, parameters);  

    
    
    //
    //
    //
    //
    var outher = this;
    return this.each(function(){                
        // Defaults
        jQuery(settings.currentPageInputId).val(settings.defaultPage);
        jQuery(settings.numRowsInputId).val(settings.defaultRowsPerPage);
        onPageInternal(false);
        
        /**
	     * Set new total pages
	     */
	     outher.setTotalRows = function(totalRows){
     		settings.totalRows = totalRows;
     		jQuery(settings.currentPageInputId).val(1);
     		jQuery(settings.totalPagesLabelId).text(Math.ceil(settings.totalRows / settings.defaultRowsPerPage));
     		onPageInternal(false);
	     }
        
        /**
         * Does paging to currentPage number (starting from 1)
         *
         *
         */
        function onPageInternal(reload){
            // New paging parameters
            var currentPage = jQuery(settings.currentPageInputId).val();            
            var rowsPerPage = jQuery(settings.numRowsInputId).val();
            
            currentPage = parseInt(currentPage);
            rowsPerPage = parseInt(rowsPerPage);
            
            if(rowsPerPage > 50){
            	alert('Maximum allowed 50 rows per page.');
            	jQuery(settings.numRowsInputId).val(50);
            	return;
            }
            
            if(currentPage == null || rowsPerPage == null
                || isNaN(currentPage) || isNaN(rowsPerPage)){
                jQuery(settings.currentPageInputId).val(settings.currentPage);
                jQuery(settings.numRowsInputId).val(settings.rowsPerPage);               
            }
            else{
            	settings.rowsPerPage = rowsPerPage;
            	settings.currentPage = currentPage;
            }
            jQuery(settings.totalPagesLabelId).text(Math.ceil(settings.totalRows / settings.rowsPerPage));
            
            if(reload){
            	settings.pagerCallback(settings.currentPage, settings.rowsPerPage);
            }
            
            // Handle button enabling
            onMiddlePage();
            if(settings.currentPage == 1){
                onFirstPage();
            }
            if(settings.currentPage == Math.ceil(settings.totalRows / settings.rowsPerPage)){
                onLastPage();
            }
        }
        
        //
        function onFirstPage(){
            jQuery(settings.startButtonId).unbind('click', btnStartButton).removeClass(settings.startButtonEnabledClass).addClass(settings.startButtonDisabledClass);
            jQuery(settings.backButtonId).unbind('click', btnBackButton).removeClass(settings.backButtonEnabledClass).addClass(settings.backButtonDisabledClass);
        }
        
        //
        function onLastPage(){
            jQuery(settings.nextButtonId).unbind('click', btnNextButton).removeClass(settings.nextButtonEnabledClass).addClass(settings.nextButtonDisabledClass);
            jQuery(settings.endButtonId).unbind('click', btnLastButton).removeClass(settings.endButtonEnabledClass).addClass(settings.endButtonDisabledClass);
        }
        
        //
        function onMiddlePage(){
            jQuery(settings.nextButtonId).unbind('click', btnNextButton);
            jQuery(settings.endButtonId).unbind('click', btnLastButton);
            jQuery(settings.backButtonId).unbind('click', btnBackButton);
            jQuery(settings.startButtonId).unbind('click', btnStartButton);
            
            jQuery(settings.startButtonId).click(btnStartButton).removeClass(settings.startButtonDisabledClass).addClass(settings.startButtonEnabledClass);
            jQuery(settings.backButtonId).click(btnBackButton).removeClass(settings.backButtonDisabledClass).addClass(settings.backButtonEnabledClass);
            jQuery(settings.nextButtonId).click(btnNextButton).removeClass(settings.nextButtonDisabledClass).addClass(settings.nextButtonEnabledClass);
            jQuery(settings.endButtonId).click(btnLastButton).removeClass(settings.endButtonDisabledClass).addClass(settings.endButtonEnabledClass);
        }
        
        //
        // Button press handlers
        //
        function btnStartButton(){
            jQuery(settings.currentPageInputId).val(1);
            onPageInternal(true);
        }      
        
        function btnBackButton(){
            var currentPage = jQuery(settings.currentPageInputId).val();
            currentPage = parseInt(currentPage);
            currentPage = currentPage - 1;
            jQuery(settings.currentPageInputId).val(currentPage);
            onPageInternal(true);
        }
        
        function btnNextButton(){
            var currentPage = jQuery(settings.currentPageInputId).val();
            currentPage = parseInt(currentPage);
            currentPage = currentPage + 1;
            jQuery(settings.currentPageInputId).val(currentPage);
            onPageInternal(true);
        }
        
        function btnLastButton(){
            jQuery(settings.currentPageInputId).val(Math.ceil(settings.totalRows / settings.rowsPerPage));
            onPageInternal(true);
        }
        
        jQuery(settings.numRowsInputId).blur(function(){
            jQuery(settings.currentPageInputId).val("1");
            
            onPageInternal(true);
        });
        
        jQuery(settings.currentPageInputId).blur(function(){
            var currentPage = jQuery(settings.currentPageInputId).val();
            currentPage = parseInt(currentPage);
            if(currentPage > Math.ceil(settings.totalRows / settings.rowsPerPage) || currentPage < 1){
                jQuery(settings.currentPageInputId).val(settings.currentPage);
            }
            onPageInternal(true);
        });
    });
};

})(jQuery);




