var NumberListPager = Class.create();
NumberListPager.prototype = {
    initialize: function(prefix, resource, pager) {
        this.prefix = prefix ? prefix : "";
        this.resource = resource;
        if (pager) {
            this.start = pager.start;
            this.from = pager.from;
            this.to = pager.to;
            this.items = pager.items;
            this.currentPage = pager.currentPage;
            this.requestedPage = pager.requestedPage;
            this.nextPage = pager.nextPage;
            this.previousPage = pager.previousPage;
            this.lastPage = pager.lastPage;
            this.itemsPerPage = pager.itemsPerPage;
            this.itemsFound = pager.itemsFound;
        } else {
            this.start = 0;
            this.from = 0;
            this.to = 0;
            this.items = 0;
            this.currentPage = 1;
            this.requestedPage = 1;
            this.nextPage = -1;
            this.previousPage = -1;
            this.lastPage = 1;
            this.itemsPerPage = 1;
            this.itemsFound = 0;
        }
        this.pageItemLinkClassName = "numbers";
        this.pageItemClassName = "jelCommentAnswer";
        this.listClassName = "page-num";
    },
    doRender: function() {
        // always update 'showing page X of X'
        $(this.prefix + 'CurrentPage').update(this.currentPage);
        $(this.prefix + 'LastPage').update(this.lastPage);
        // update the pagination
        if (this.lastPage != 1) {
            // previous page link
            this.doUpdateRelativePageItem(this.prefix + 'PrevPage', (this.currentPage == 1), -1);
            // next page link
            this.doUpdateRelativePageItem(this.prefix + 'NextPage', (this.currentPage == this.lastPage), 1);
            // update page numbers
            var oldPageNumberList = $(this.prefix + 'PageNumberList');
            var newPageNumberList = $(document.createElement("ul"));
            newPageNumberList.setAttribute("id", this.prefix + "PageNumberList");
            newPageNumberList.addClassName(this.listClassName);
            for (var page = 1; page <= this.lastPage; page++) {
                if (this.lastPage <= 10) {
                    if (this.currentPage != page) {
                        newPageNumberList.appendChild(this.createPageItem(page, true));
                    } else {
                        newPageNumberList.appendChild(this.createPageItem(page, false));
                    }
                } else {
                    if (((this.currentPage <= 5) && (page <= 11) && (this.currentPage != page)) ||
                        ((page >= (this.currentPage - 6)) && (page <= (this.currentPage + 5)) && (this.currentPage != page))) {
                        newPageNumberList.appendChild(this.createPageItem(page, true));
                    } else if (this.currentPage == page) {
                        newPageNumberList.appendChild(this.createPageItem(page, false));
                    }
                }
            }
            oldPageNumberList.parentNode.replaceChild(newPageNumberList, oldPageNumberList);
            // now show it
            Element.show(this.prefix + 'PagerDiv');
        } else {
            // there are no pages to show
            Element.hide(this.prefix + 'PagerDiv');
        }
    },
    doUpdateRelativePageItem: function(element, hide, i) {
        var pageLink = $(element);
        if (hide) {
            pageLink.hide();
        } else {
            $(element + 'Link').setAttribute("href", this.resource.getUrl(this.currentPage + i));
            pageLink.show();
        }
    },
    createPageItem: function(page, showLink) {
        var pageItem = $(document.createElement('li'));
        pageItem.setAttribute("id", this.prefix + "PageItem_" + page);
        if (showLink) {
            var pageItemLink = $(document.createElement('a'));
            pageItemLink.addClassName(this.pageItemLinkClassName);
            pageItemLink.setAttribute("href", this.resource.getUrl(page));
            pageItemLink.setAttribute("page", page);
            pageItemLink.appendChild(document.createTextNode(page));
            pageItem.appendChild(pageItemLink);
            Event.observe(pageItemLink, 'click', this.doPageItemLinkClick.bindAsEventListener(this));
        } else {
            pageItem.addClassName(this.pageItemClassName);
            pageItem.appendChild(document.createTextNode(page));
        }
        return pageItem;
    },
// navigation
    goPage: function(page) {
        this.requestedPage = page;
        return this.resource.doUpdate();
    },
    goPrevious: function(e) {
        if (e) {
            if (e.preventDefault) {
                e.preventDefault();
            }
            e.returnValue = false;
        }
        return this.goPage(this.previousPage);
    },
    goNext: function(e) {
        if (e) {
            if (e.preventDefault) {
                e.preventDefault();
            }
            e.returnValue = false;
        }
        return this.goPage(this.nextPage);
    },
    doPageItemLinkClick: function(e) {
        var page;
        if (e) {
            if (e.preventDefault) {
                e.preventDefault();
            }
            e.returnValue = false;
            var element = Event.element(e);
            if (element) {
                page = element.readAttribute("page");
            }
        }
        page = page ? page : 1;
        return this.goPage(page);
    }
};

if (window.setPagerLoaded) {
    setPagerLoaded();
}