(function() {
    jQuery.fn.ulPager =
        function(pageSize, options) {
            pageSize = isNaN(parseInt(pageSize)) ? 100 : parseInt(pageSize);
            elements = 0;
            pages = 0;
            currentPage = 1;
            var settings = jQuery.extend({
                previous: "up_previous",
                next: "up_next",
                first: "up_first",
                last: "up_last",
                pageSeqBox: "up_seqbox",
                pageSeqBoxClass: "up-seqbox",
                filter: null,
                saveCurrentPage: null,
                startPage: 0
            }, options);
            function init(list) {
                var firstRowIdx = getFirstElementIndex(1);
                if (settings.startPage>0) {
					firstRowIdx = getFirstElementIndex(settings.startPage);
					currentPage = settings.startPage;
                }
                createPageSequence();
                displayPage(list, firstRowIdx);
                createPageSelected();
                if (settings.saveCurrentPage!=null) {
					$('#'+settings.saveCurrentPage).val(currentPage)
                }
            }
            // Calculates how many pages there will be
            function countPages(list) {
                if (settings.filter!=null)
					element = $("li", $this).filter(function (index) {
	                  return settings.filter($(this));
		            });
		        else
					element = $("li", $this);
                elements = element.length;
                var _p = elements / pageSize;
                if ((_p + "").indexOf(".") != -1) {
                    pages = parseInt(_p) + 1;
                }
                else {
                    pages = _p;
                }
            }
            // Creates buttons for paging
            function createPageSequence() {
                if (pages > 0) {
                    var con = '<ul class="' + settings.pageSeqBoxClass + '">';
                    con += '<li class="up_pageinfo"></li>';
                    con += '<li>';
                    con += '<a href="" id="' + settings.previous + '">f&ouml;reg&aring;ende</a>';
                    con += '</li>';
                    con += '<li>';
                    con += '<a href="" id="' + settings.first + '" title="F&ouml;rsta sidan">&nbsp;</a>';
                    con += '</li>';
                    for (i = 0; i < pages; i++) {
                        con += '<li>';
                        con += '<a href="" page_num="up_' + (i + 1) + '">' + (i + 1) + '</a>';
                        con += '</li>';
                    }
                    con += '<li>';
                    con += '<a href="" id="' + settings.last + '" title="Sista sidan">&nbsp;</a>';
                    con += "</li>";
                    con += '<li>';
                    con += '<a href="" id="' + settings.next + '">n&auml;sta</a>';
                    con += "</li>";
                    con += "</ul>";
                    jQuery("#" + settings.pageSeqBox).text('').append(con);
                }
                else
                    jQuery("#" + settings.pageSeqBox).text('');
            }
            // Adds info about 
            function createPageInfo(info) {
                jQuery("#" + settings.pageSeqBox + " li.up_pageinfo").text('').append(info);
            }
            // Adds css class to current page
            function createPageSelected() {
                jQuery("#" + settings.pageSeqBox).find("a").not("#up_previous, #up_next, #up_first, #up_last").each(
					function()
					{
						var pageNum = parseInt($(this).attr("page_num").replace("up_", ""));
							$(this).removeClass('selected');
						if (pageNum==currentPage)
							$(this).addClass('selected');
                    }
                );
            }
            // Calculates the index of the first element of the page number
            function getFirstElementIndex(pageNumber) {
                return pageSize * (pageNumber - 1);
            }
            // Display a page
            function displayPage(list, firstRowIdx) {
                // First hide all rows         
                jQuery("li", list).hide();
                // Show elements of wanted page      
                if (settings.filter!=null)
					jQuery("li", list).filter(function (index) {
	                  return settings.filter($(this));
					}).slice(firstRowIdx, firstRowIdx + pageSize).show();
				else
					jQuery("li", list).slice(firstRowIdx, firstRowIdx + pageSize).show();
				// Create data for page info
                var a = (firstRowIdx+1)+'-';
				if((firstRowIdx + pageSize)<elements)
					a += (firstRowIdx + pageSize) + ' av ' + elements;
				else
					a += elements + ' av ' + elements;						
                createPageInfo(a);
            }
            // User wants an exact page 
            function showPage(list, pageNumber) {
                if (pages >= pageNumber > 0) {
                    displayPage(list, getFirstElementIndex(pageNumber));
                    currentPage = pageNumber;
                    createPageSelected();
                    if (settings.saveCurrentPage!=null) {
						$('#'+settings.saveCurrentPage).val(currentPage);
                    }
                }
            }
            // User wants next page 
            function showNextPage(list) {
                if (currentPage < pages) {
                    displayPage(list, getFirstElementIndex(currentPage + 1));
                    currentPage += 1;
                    createPageSelected();
                    if (settings.saveCurrentPage!=null) {
						$('#'+settings.saveCurrentPage).val(currentPage);
                    }
               }
            }
            // User wants previous page 
            function showPreviousPage(list) {
                if (currentPage > 1) {
                    displayPage(list, getFirstElementIndex(currentPage - 1));
                    currentPage -= 1;
                    createPageSelected();
                    if (settings.saveCurrentPage!=null) {
						$('#'+settings.saveCurrentPage).val(currentPage);
                    }
                }
            }
            // Startup
            return this.each(function() {
                $this = $(this);
                countPages($this);
                init($this);
                $("#" + settings.first).addClass("up-first").bind("click", function() { showPage($this, 1); return false; });
                $("#" + settings.last).addClass("up-last").bind("click", function() { showPage($this, pages); return false; });
                $("#" + settings.previous).addClass("up-previous").bind("click", function() { showPreviousPage($this); return false; });
                $("#" + settings.next).addClass("up-next").bind("click", function() { showNextPage($this); return false; });
                $("#" + settings.pageSeqBox).find("a").not("#up_previous, #up_next, #up_first, #up_last").bind("click", function() { showPage($this, parseInt($(this).attr("page_num").replace("up_", ""))); return false; });
            });
        };
})(jQuery); 