001/*
002 * #%L
003 * Netarchivesuite - heritrix 3 monitor
004 * %%
005 * Copyright (C) 2005 - 2018 The Royal Danish Library, 
006 *             the National Library of France and the Austrian National Library.
007 * %%
008 * This program is free software: you can redistribute it and/or modify
009 * it under the terms of the GNU Lesser General Public License as
010 * published by the Free Software Foundation, either version 2.1 of the
011 * License, or (at your option) any later version.
012 * 
013 * This program is distributed in the hope that it will be useful,
014 * but WITHOUT ANY WARRANTY; without even the implied warranty of
015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
016 * GNU General Lesser Public License for more details.
017 * 
018 * You should have received a copy of the GNU General Lesser Public
019 * License along with this program.  If not, see
020 * <http://www.gnu.org/licenses/lgpl-2.1.html>.
021 * #L%
022 */
023
024package dk.netarkivet.heritrix3.monitor;
025
026/**
027 * Builds a pagination HTML text block using twitter-bootstrap styles.
028 *
029 * <div class="pagination pull-right">
030 *   <ul>
031 *     <li class="disabled"><span>Previous</span></li>
032 *     <li class="active"><span>1</span></li>
033 *     <li><a href="#">2</a></li>
034 *     <li><a href="#">3</a></li>
035 *     <li class="disabled"><span>...</span></li>
036 *     <li><a href="#">8</a></li>
037 *     <li><a href="#">9</a></li>
038 *     <li><a href="#">10</a></li>
039 *     <li><a href="#">Next</a></li>
040 *   </ul>
041 * </div>
042 */
043public class Pagination {
044
045    /**
046     * Calculate the total number of pages.
047     * @param items total number of items
048     * @param itemsPerPage items displayed per page
049     * @return the total number of pages
050     */
051    public static long getPages(long items, long itemsPerPage) {
052        long pages = (items + itemsPerPage - 1) / itemsPerPage;
053        if (pages == 0) {
054            pages = 1;
055        }
056        return pages;
057    }
058
059    /**
060     * Builds a pagination HTML text block.
061     * 
062     * @param page current page
063     * @param itemsPerPage items displayed per page
064     * @param pages total number of pages
065     * @return HTML text block
066     */
067    public static String getPagination(long page, long itemsPerPage, long pages, boolean bShowAll, String additionalParams) {
068        if (page < 1) {
069            page = 1;
070        }
071        if (pages == 0) {
072            pages = 1;
073        }
074        if (page > pages) {
075            page = pages;
076        }
077        StringBuilder sb = new StringBuilder();
078        sb.append("<div class=\"pagination pull-right\">\n");
079        sb.append("<ul>\n");
080        // Previous
081        if (page > 1) {
082            sb.append("<li><a href=\"?page=" + (page - 1) + "&itemsperpage=" + itemsPerPage + additionalParams + "\">Previous</a></li>");
083        } else {
084            sb.append("<li class=\"disabled\"><span>Previous</span></li>");
085        }
086        // First.
087        if (page == 1) {
088            sb.append("<li class=\"active\"><span>" + 1 + "</span></li>");
089        } else {
090            sb.append("<li><a href=\"?page=" + 1 + "&itemsperpage=" + itemsPerPage + additionalParams + "\">" + 1 + "</a></li>");
091        }
092        // List.
093        long tmpPage = page - 3;
094        if (tmpPage > pages - 7) {
095            tmpPage = pages - 7;
096        }
097        if (tmpPage > 2) {
098            sb.append("<li class=\"disabled\"><span>...</span></li>");
099        } else {
100            tmpPage = 2;
101        }
102        int show = 8;
103        while (show > 1 && tmpPage <= pages) {
104            if (tmpPage == page) {
105                sb.append("<li class=\"active\"><span>" + tmpPage + "</span></li>");
106            } else {
107                sb.append("<li><a href=\"?page=" + tmpPage + "&itemsperpage=" + itemsPerPage + additionalParams + "\">" + tmpPage + "</a></li>");
108            }
109            --show;
110            tmpPage++;
111        }
112        // Last
113        if (tmpPage <= pages) {
114            if (tmpPage < pages) {
115                sb.append("<li class=\"disabled\"><span>...</span></li>");
116            }
117            if (tmpPage == page) {
118                sb.append("<li class=\"active\"><span>" + pages + "</span></li>");
119            } else {
120                sb.append("<li><a href=\"?page=" + pages + "&itemsperpage=" + itemsPerPage + additionalParams  + "\">" + pages + "</a></li>");
121            }
122        }
123        // Next.
124        if (page < pages) {
125            sb.append("<li><a href=\"?page=" + (page + 1) + "&itemsperpage=" + itemsPerPage + additionalParams + "\">Next</a></li>");
126        } else {
127            sb.append("<li class=\"disabled\"><span>Next</span></li>");
128        }
129        // Items per page.
130        /*
131        sb.append("<li>");
132        String[][] options = new String[][] {{"10", "10"}, {"25", "25"}, {"50", "50"}, {"100", "100"}, {"all", "Vis alle"}};
133        int selected;
134        if (bShowAll) {
135            selected = options.length - 1;
136        } else {
137            switch ((int)itemsPerPage) {
138            case 10:
139                selected = 0;
140                break;
141            default:
142            case 25:
143                selected = 1;
144                break;
145            case 50:
146                selected = 2;
147                break;
148            case 100:
149                selected = 3;
150                break;
151            }
152        }
153        sb.append("<select name=\"itemsperpage\" class=\"input-mini\" onchange=\"this.form.submit();\">");
154        for (int i=0; i<options.length; ++i) {
155            sb.append("<option value=\"");
156            sb.append(options[i][0]);
157            sb.append("\"");
158            if (i == selected) {
159                sb.append(" selected=\"1\"");
160            }
161            sb.append(">");
162            sb.append(options[i][1]);
163            sb.append("</option>");
164        }
165        sb.append("</select>");
166        sb.append("</li>");
167        */
168        sb.append("</ul>\n");
169        sb.append("</div>\n");
170        return sb.toString();
171    }
172
173}