function PaginationState(numResults, viewPortMaxPages, itemsPerPage) {
    this.selectedPage = 1;
    this.viewPortStartPage = 1;
    this.viewPortMaxPages = viewPortMaxPages;
    this.itemsPerPage = itemsPerPage;
    this.numPages = Math.ceil(numResults / this.itemsPerPage);
}

function Pagination(paginationState) {
    var pageLinkPrefix = "pagination-page-";
    var pageLinkPrefix2 = "pagination2-page-";
    
    var pageLinksId = "pagination-page-links1";
    var pageLinksId2 = "pagination-page-links2";

    this.checkStartPage = function(){
        if(window.location.search == getCookie('mi_pagination_search')){
            var request = getCookie('mi_pagination_current');
            if(request != null){
                paginationState.selectedPage = request;
                this.showPage(paginationState.selectedPage);
                if((paginationState.selectedPage-3 >= 1) &&
                    ((paginationState.selectedPage-3) + paginationState.viewPortMaxPages < paginationState.numPages)){
                    paginationState.viewPortStartPage = paginationState.selectedPage-3;
                }
                else if(paginationState.selectedPage-3 < 1){
                    paginationState.viewPortStartPage = 1;
                }
                else{
                    paginationState.viewPortStartPage = paginationState.numPages - paginationState.viewPortMaxPages + 1;
                }
            }
        }
        else {
            deleteCookie('mi_pagination_search');
            deleteCookie('mi_pagination_current');
            if(document.getElementById('ajax-container-table').style.visibility == "hidden"){
                document.getElementById('ajax-container-table').style.visibility = "visible";
            }
        }
    }

    this.updatePageLinks = function() {                    
        var page = paginationState.viewPortStartPage;
        var endPage = this.getEndPageNum(page);
        
        var html = "";
        var html2 = "";
        
        while(page <= endPage) {
          html += "<a id=\"" + pageLinkPrefix + page + "\" href=\"#content\" onclick=\"pagination.showPage(" + page + ")\">" + page + "</a> ";
          html2 += "<a id=\"" + pageLinkPrefix2 + page + "\" href=\"#content\" onclick=\"pagination2.showPage(" + page + ")\">" + page + "</a> ";
           page++;
        }
        
        var pageLinks = document.getElementById(pageLinksId);
        pageLinks.innerHTML = html;
        
        var pageLinks2 = document.getElementById(pageLinksId2);
        pageLinks2.innerHTML = html2;
        
        this.disableSelectedPage();

        setCookie('mi_pagination_current', paginationState.selectedPage);
        setCookie('mi_pagination_search', window.location.search);

    }
    
    this.getEndPageNum = function(startPage) {
        var endPage = (startPage - 1) + paginationState.viewPortMaxPages;
        
        if (endPage > paginationState.numPages) {
            endPage = paginationState.numPages;
        }
        
        return endPage;
    }
    
    this.showPage = function(pageNum) {
        filterSearch(pageNum - 1);
        paginationState.selectedPage = pageNum;
        this.updatePageLinks();
        
        if (this.isFirstPageSelected()) {
            this.disable("prev");
        } else if (!this.isFirstPageSelected()) {
            this.enable("prev");
        }
        
        if (this.isLastPageSelected()) {
            this.disable("next");
        } else if (!this.isLastPageSelected()) {
            this.enable("next");
        }
    }

    this.showPageWithoutFilter = function(pageNum) {
        paginationState.selectedPage = pageNum;
        this.updatePageLinks();
        
        if (this.isFirstPageSelected()) {
            this.disable("prev");
        } else if (!this.isFirstPageSelected()) {
            this.enable("prev");
        }

        if (this.isLastPageSelected()) {
            this.disable("next");
        } else if (!this.isLastPageSelected()) {
            this.enable("next");
        }
    }
    
    this.disableSelectedPage = function() {
        var selectedPageLink = document.getElementById(pageLinkPrefix + paginationState.selectedPage);
        if (selectedPageLink) {
            selectedPageLink.className = "disabled";
        }
        
        var selectedPageLink2 = document.getElementById(pageLinkPrefix2 + paginationState.selectedPage);
        if (selectedPageLink2) {
            selectedPageLink2.className = "disabled";
        }
    }
    
    this.prev = function() {
        if (!this.haveDisplayedFirstPage()) {
            paginationState.viewPortStartPage--;
        }
        
        if (!this.isFirstPageSelected()) {
            paginationState.selectedPage--;
            this.showPage(paginationState.selectedPage);
            if(paginationState.selectedPage != 1){
                //document.getElementById("pagination-prev-1").href = "#" + (paginationState.selectedPage);
                //document.getElementById("pagination-prev-2").href = "#" + (paginationState.selectedPage);
            }
            else{
                //document.getElementById("pagination-prev-1").href = "#1";
                //document.getElementById("pagination-prev-2").href = "#1";
            }
        }
    }
    
    this.next = function() {
        if (!this.haveDisplayedLastPage()) {
            paginationState.viewPortStartPage++;
        }
        
        if (!this.isLastPageSelected()) {
            paginationState.selectedPage++;
            this.showPage(paginationState.selectedPage);
            if(paginationState.selectedPage != paginationState.viewPortMaxPages){
                //document.getElementById("pagination-next-1").href = "#" + (paginationState.selectedPage);
                //document.getElementById("pagination-next-2").href = "#" + (paginationState.selectedPage);
            }
            else{
                //document.getElementById("pagination-next-1").href = "#" + paginationState.viewPortMaxPages;
                //document.getElementById("pagination-next-2").href = "#" + paginationState.viewPortMaxPages;
            }
        }
    }
    
    this.isLastPageSelected = function() {
        return paginationState.selectedPage == paginationState.numPages;
    }
    
    this.isFirstPageSelected = function() {
        return paginationState.selectedPage == 1;                    
    }
    
    this.haveDisplayedLastPage = function() {
        var lastPageElement = document.getElementById(pageLinkPrefix + paginationState.numPages);
        return lastPageElement ? true : false;
        
        var lastPageElement2 = document.getElementById(pageLinkPrefix2 + paginationState.numPages);
        return lastPageElement2 ? true : false;
    }
    
    this.haveDisplayedFirstPage = function() {
        return paginationState.viewPortStartPage == 1;
    }
    
    this.disable = function(direction) {
        this.getDirectionLink(direction).className = "disabled";
        this.getDirectionLink2(direction).className = "disabled";
    }
    
    this.enable = function(direction) {
        this.getDirectionLink(direction).className = "enabled";
        this.getDirectionLink2(direction).className = "enabled";
    }
    
    this.getDirectionLink = function(direction) {
        return document.getElementById("pagination-" + direction + "-1");
    }
    
    this.getDirectionLink2 = function(direction) {
        return document.getElementById("pagination-" + direction + "-2");
    }
    
}