Inputs
------
totalEntries
entriesPerPage
currentPage
maxPages this is actually the maximum numbers of pages to show *excluding* the current page
Outputs
-------
qtr1Range
qtr2Range
qtr3Range
qtr4Range
Definitions
-----------
ceiling = the smallest integer value greater than or equal to the given numerical argument.
floor = the largest integer value less than or equal to the numerical argument.
round = the nearest integer value to the numerical argument,
Numbers that are halfway between two integers are rounded "to infinity",
per standard conventions
Step 1
======
totalPages = ceiling( totalEntries / entriesPerPage )
visiblePages = minimum of maxPages and ( totalPages - 1 )
Step 2
======
if we can show all the pages [ totalPages - 1 <= maxPages ]
then
q1Size = currentPage - 1
q2Size = 0
q3Size = 0
q4Size = totalPages - currentPage
and skip forwards to Step 3
otherwise calculate the base segment sizes
q1Size = floor( visiblePages / 4 )
q2Size = round( visiblePages / 4 )
q3Size = ceiling( visiblePages / 4 )
q4Size = round( (visiblePages - q2Size) / 3 )
and now carry out the steps for the first matching condition
a) current page is in the 1st quarter [ currentPage - q1Size < 1 ]
additionalPages = q1Size + q2Size - currentPage + 1
q1Size = currentPage - 1
q2Size = 0
q3Size = q3Size + ceiling( additionalPages / 2 )
q4Size = q4Size + floor( additionalPages / 2 )
b) 1st and 2nd quarters intersect [ currentPage - q2Size - ceiling( q2Size / 3 ) <= q1Size ]
adjustment = ceiling( (3 * (currentPage - q1Size - 1)) / 4 )
additionalPages = q2Size - adjustment
q2Size = adjustment
q3Size = q3Size + ceiling( additionalPages / 2 )
q4Size = q4Size + floor( additionalPages / 2 )
c) current pages is in the 4th quarter [ currentPage + q4Size >= totalPages ]
additionalPages = q3Size + q4Size - totalPages + currentPage
q1Size = q1Size + floor( additionalPages / 2 )
q2Size = q2Size + ceiling( additionalPages / 2 )
q3Size = 0
q4Size = totalPages - currentPage
d) 3rd and 4th quarters intersect [ currentPage + q3Size >= totalPages - q4Size ]
adjustment = ceiling( (3 * (totalPages - currentPage - q4Size)) / 4 )
additionalPages = q3Size - adjustment
q1Size = q1Size + floor( additionalPages / 2 )
q2Size = q2Size + ceiling( additionalPages / 2 )
q3Size = adjustment
Step 3
======
if q1Size = 0
then q1Range is empty
otherwise q1Range is 1 .. q1Size
if q2Size = 0
then q2Range is empty
otherwise q2Range is (currentPage - q2Size) .. (currentPage - 1)
if q3Size = 0
then q3Range is empty
otherwise q3Range is (currentPage + 1) .. (currentPage + q3Size)
if q4Size = 0
then q4Range is empty
otherwise q4Range is (totalPages - q4Size + 1) .. totalPages
Example Results
===============
totalEntries = 200
entriesPerPage = 10
maxPages = 10
-----------------------
currentPage = 3
q1Range is 1 .. 2
q2Range is empty
q3Range is 4 .. 8
q4Range is 18 .. 20
---------------------
currentPage = 12
q1Range is 1 .. 2
q2Range is 9 .. 11
q3Range is 13 .. 15
q4Range is 19 .. 20
----------------------
currentPage = 15
q1Range is 1 .. 2
q2Range is 12 .. 14
q3Range is 16 .. 18
q4Range is 19 .. 20
-----------------------