001package dk.netarkivet.harvester.webinterface.servlet;
002
003/**
004 * Builds a pagination HTML text block using twitter-bootstrap styles.
005 *
006 * <div class="pagination pull-right">
007 *   <ul>
008 *     <li class="disabled"><span>Forrige</span></li>
009 *     <li class="active"><span>1</span></li>
010 *     <li><a href="#">2</a></li>
011 *     <li><a href="#">3</a></li>
012 *     <li class="disabled"><span>...</span></li>
013 *     <li><a href="#">8</a></li>
014 *     <li><a href="#">9</a></li>
015 *     <li><a href="#">10</a></li>
016 *     <li><a href="#">Næste</a></li>
017 *   </ul>
018 * </div>
019 */
020public class Pagination {
021
022    /**
023     * Calculate the total number of pages.
024     * @param items total number of items
025     * @param itemsPerPage items displayed per page
026     * @return the total number of pages
027     */
028    public static long getPages(long items, long itemsPerPage) {
029        long pages = (items + itemsPerPage - 1) / itemsPerPage;
030        if (pages == 0) {
031            pages = 1;
032        }
033        return pages;
034    }
035
036    /**
037     * Builds a pagination HTML text block.
038     * 
039     * @param page current page
040     * @param itemsPerPage items displayed per page
041     * @param pages total number of pages
042     * @return HTML text block
043     */
044    public static String getPagination(long page, long itemsPerPage, long pages, boolean bShowAll) {
045        if (page < 1) {
046            page = 1;
047        }
048        if (pages == 0) {
049            pages = 1;
050        }
051        if (page > pages) {
052            page = pages;
053        }
054        StringBuilder sb = new StringBuilder();
055        sb.append("<div class=\"pagination pull-right\">\n");
056        sb.append("<ul>\n");
057        // Previous
058        if (page > 1) {
059            sb.append("<li><a href=\"?page=" + (page - 1) + "&itemsperpage="
060                    + itemsPerPage + "\">Forrige</a></li>");
061        } else {
062            sb.append("<li class=\"disabled\"><span>Forrige</span></li>");
063        }
064        // First.
065        if (page == 1) {
066            sb.append("<li class=\"active\"><span>" + 1 + "</span></li>");
067        } else {
068            sb.append("<li><a href=\"?page=" + 1 + "&itemsperpage="
069                    + itemsPerPage + "\">" + 1 + "</a></li>");
070        }
071        // List.
072        long tmpPage = page - 3;
073        if (tmpPage > pages - 7) {
074            tmpPage = pages - 7;
075        }
076        if (tmpPage > 2) {
077            sb.append("<li class=\"disabled\"><span>...</span></li>");
078        } else {
079            tmpPage = 2;
080        }
081        int show = 8;
082        while (show > 1 && tmpPage <= pages) {
083            if (tmpPage == page) {
084                sb.append("<li class=\"active\"><span>" + tmpPage
085                        + "</span></li>");
086            } else {
087                sb.append("<li><a href=\"?page=" + tmpPage + "&itemsperpage="
088                        + itemsPerPage + "\">" + tmpPage + "</a></li>");
089            }
090            --show;
091            tmpPage++;
092        }
093        // Last
094        if (tmpPage <= pages) {
095            if (tmpPage < pages) {
096                sb.append("<li class=\"disabled\"><span>...</span></li>");
097            }
098            if (tmpPage == page) {
099                sb.append("<li class=\"active\"><span>" + pages
100                        + "</span></li>");
101            } else {
102                sb.append("<li><a href=\"?page=" + pages + "&itemsperpage="
103                        + itemsPerPage + "\">" + pages + "</a></li>");
104            }
105        }
106        // Next.
107        if (page < pages) {
108            sb.append("<li><a href=\"?page=" + (page + 1) + "&itemsperpage="
109                    + itemsPerPage + "\">Næste</a></li>");
110        } else {
111            sb.append("<li class=\"disabled\"><span>Næste</span></li>");
112        }
113        // Items per page.
114        sb.append("<li>");
115        String[][] options = new String[][] {{"10", "10"}, {"25", "25"}, {"50", "50"}, {"100", "100"}, {"all", "Vis alle"}};
116        int selected;
117        if (bShowAll) {
118            selected = options.length - 1;
119        } else {
120            switch ((int)itemsPerPage) {
121            case 10:
122                selected = 0;
123                break;
124            default:
125            case 25:
126                selected = 1;
127                break;
128            case 50:
129                selected = 2;
130                break;
131            case 100:
132                selected = 3;
133                break;
134            }
135        }
136        //sb.append("<select name=\"organization\" class=\"input-mini\" onchange=\"submitForm('myform');\">");
137        sb.append("<select name=\"itemsperpage\" class=\"input-mini\" onchange=\"this.form.submit();\">");
138        for (int i=0; i<options.length; ++i) {
139            sb.append("<option value=\"");
140            sb.append(options[i][0]);
141            sb.append("\"");
142            if (i == selected) {
143                sb.append(" selected=\"1\"");
144            }
145            sb.append(">");
146            sb.append(options[i][1]);
147            sb.append("</option>");
148        }
149        sb.append("</select>");
150        sb.append("</li>");
151        sb.append("</ul>\n");
152        sb.append("</div>\n");
153        return sb.toString();
154    }
155
156}