[jsword-svn] r2210 - in trunk/jsword/src: main/java/org/crosswire/jsword/passage main/java/org/crosswire/jsword/versification main/resources test/java/org/crosswire/jsword/passage test/java/org/crosswire/jsword/versification

dmsmith at crosswire.org dmsmith at crosswire.org
Sat Jan 14 07:10:45 MST 2012


Author: dmsmith
Date: 2012-01-14 07:10:44 -0700 (Sat, 14 Jan 2012)
New Revision: 2210

Added:
   trunk/jsword/src/main/java/org/crosswire/jsword/versification/BibleBookList.java
   trunk/jsword/src/test/java/org/crosswire/jsword/versification/BibleInfoTest.java
Removed:
   trunk/jsword/src/test/java/org/crosswire/jsword/passage/BibleInfoTest.java
Modified:
   trunk/jsword/src/main/java/org/crosswire/jsword/passage/PassageTally.java
   trunk/jsword/src/main/java/org/crosswire/jsword/versification/BibleInfo.java
   trunk/jsword/src/main/java/org/crosswire/jsword/versification/BibleNames.java
   trunk/jsword/src/main/java/org/crosswire/jsword/versification/ReferenceSystem.java
   trunk/jsword/src/main/resources/BibleNames_en.properties
   trunk/jsword/src/test/java/org/crosswire/jsword/passage/AllTests.java
   trunk/jsword/src/test/java/org/crosswire/jsword/passage/PassageParentTst.java
   trunk/jsword/src/test/java/org/crosswire/jsword/passage/PassageTally2Test.java
   trunk/jsword/src/test/java/org/crosswire/jsword/passage/VerseRangeTest.java
Log:
More av11n changes.
Refactoring test cases.

Modified: trunk/jsword/src/main/java/org/crosswire/jsword/passage/PassageTally.java
===================================================================
--- trunk/jsword/src/main/java/org/crosswire/jsword/passage/PassageTally.java	2012-01-14 14:06:50 UTC (rev 2209)
+++ trunk/jsword/src/main/java/org/crosswire/jsword/passage/PassageTally.java	2012-01-14 14:10:44 UTC (rev 2210)
@@ -416,8 +416,8 @@
             PassageTally that_rt = (PassageTally) that;
 
             int vib = BibleInfo.maximumOrdinal();
-            for (int i = 0; i < vib; i++) {
-                increment(i + 1, that_rt.board[i]);
+            for (int i = 0; i <= vib; i++) {
+                increment(i, that_rt.board[i]);
             }
 
             incrementMax(that_rt.max);
@@ -446,7 +446,7 @@
             PassageTally that_rt = (PassageTally) that;
 
             int vib = BibleInfo.maximumOrdinal();
-            for (int i = 0; i < vib; i++) {
+            for (int i = 0; i <= vib; i++) {
                 increment(i, -that_rt.board[i]);
             }
         } else {
@@ -473,9 +473,9 @@
             PassageTally that_rt = (PassageTally) that;
 
             int vib = BibleInfo.maximumOrdinal();
-            for (int i = 0; i < vib; i++) {
+            for (int i = 0; i <= vib; i++) {
                 if (that_rt.board[i] != 0) {
-                    kill(i + 1);
+                    kill(i);
                 }
             }
         } else {
@@ -497,7 +497,7 @@
         optimizeWrites();
 
         int vib = BibleInfo.maximumOrdinal();
-        for (int i = 0; i < vib; i++) {
+        for (int i = 0; i <= vib; i++) {
             board[i] = 0;
         }
 
@@ -552,7 +552,7 @@
         optimizeWrites();
 
         int vib = BibleInfo.maximumOrdinal();
-        for (int i = 0; i < vib; i++) {
+        for (int i = 0; i <= vib; i++) {
             if (board[i] != 0) {
                 board[i] = 1;
             }
@@ -584,15 +584,15 @@
                 }
             }
         } else {
-            int[] new_board = new int[BibleInfo.maximumOrdinal()];
+            int vib = BibleInfo.maximumOrdinal();
+            int[] new_board = new int[vib + 1];
 
-            int vib = new_board.length;
-            for (int i = 0; i < vib; i++) {
+            for (int i = 0; i <= vib; i++) {
                 if (board[i] != 0) {
                     // This could be re-written more simply:
                     // for (int j = -verses; j <= verses; j++) {
                     //     int k = i + j;
-                    //     if (k >= 0 && k < BibleInfo.maximumOrdinal()) {
+                    //     if (k >= 0 && k <= BibleInfo.maximumOrdinal()) {
                     //         new_board[k] += board[i] + verses - mod(j);
                     //     }
                     // }
@@ -637,7 +637,7 @@
         int vib = BibleInfo.maximumOrdinal();
         max = 0;
         size = 0;
-        for (int i = 0; i < vib; i++) {
+        for (int i = 0; i <= vib; i++) {
             if (board[i] > 0) {
                 size++;
             }
@@ -841,9 +841,9 @@
             TreeSet<TalliedVerse> output = new TreeSet<TalliedVerse>();
 
             int vib = BibleInfo.maximumOrdinal();
-            for (int i = 0; i < vib; i++) {
+            for (int i = 0; i <= vib; i++) {
                 if (board[i] != 0) {
-                    output.add(new TalliedVerse(i + 1, board[i]));
+                    output.add(new TalliedVerse(i, board[i]));
                 }
             }
 

Added: trunk/jsword/src/main/java/org/crosswire/jsword/versification/BibleBookList.java
===================================================================
--- trunk/jsword/src/main/java/org/crosswire/jsword/versification/BibleBookList.java	                        (rev 0)
+++ trunk/jsword/src/main/java/org/crosswire/jsword/versification/BibleBookList.java	2012-01-14 14:10:44 UTC (rev 2210)
@@ -0,0 +1,155 @@
+/**
+ * Distribution License:
+ * JSword is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License, version 2.1 as published by
+ * the Free Software Foundation. This program is distributed in the hope
+ * that it will be useful, but WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU Lesser General Public License for more details.
+ *
+ * The License is available on the internet at:
+ *       http://www.gnu.org/copyleft/lgpl.html
+ * or by writing to:
+ *      Free Software Foundation, Inc.
+ *      59 Temple Place - Suite 330
+ *      Boston, MA 02111-1307, USA
+ *
+ * Copyright: 2012
+ *     The copyright to this program is held by it's authors.
+ *
+ * ID: $Id$
+ */
+package org.crosswire.jsword.versification;
+
+import java.util.Iterator;
+
+/**
+ * A BibleBookList is an ordered list of one or more BibleBooks.
+ * Typically, a BibleBookList is a member of a ReferenceSystem.
+ *
+ * @see gnu.lgpl.License for license details.<br>
+ *      The copyright to this program is held by it's authors.
+ * @author DM Smith [dmsmith555 at yahoo dot com]
+ */
+public class BibleBookList {
+    /**
+     * Create an ordered BibleBookList from the input.
+     * @param books
+     */
+    public BibleBookList(BibleBook[] books) {
+        this.books = books.clone();
+        initialize();
+    }
+
+    /**
+     * Does this ReferenceSystem contain the BibleBook.
+     * 
+     * @param book
+     * @return true if it is present.
+     */
+    public boolean contains(BibleBook book) {
+        return bookMap[book.ordinal()] != -1;
+    }
+
+    /**
+     * Where does the BibleBook come in the order of books of the Bible.
+     * The first book is 0, the next is 1 and so forth.
+     * If the BibleBook is not in this Reference System,
+     * then the return value of this routine is -1.
+     * 
+     * @param book
+     * return the ordinal value of the book or -1 if not present
+     */
+    public int getOrdinal(BibleBook book) {
+        return bookMap[book.ordinal()];
+    }
+
+    /**
+     * Get the number of books in this ReferenceSystem.
+     * @return the number of books
+     */
+    public int getBookCount() {
+        return books.length;
+    }
+
+    /**
+     * Get the BibleBook by its position in this ReferenceSystem.
+     * If the position is negative, return the first book.
+     * If the position is greater than the last, return the last book.
+     * 
+     * @param ordinal
+     * @return the indicated book
+     */
+    public BibleBook getBook(int ordinal) {
+        int ord = ordinal;
+        if (ord < 0) {
+            ord = 0;
+        }
+        if (ord >= books.length) {
+            ord = books.length - 1;
+        }
+        return books[ord];
+    }
+
+    /**
+     * Get the BibleBooks in this ReferenceSystem.
+     * 
+     * @return an Iterator over the books
+     */
+    public Iterator getBooks() {
+        return null;
+    }
+
+    /**
+     * Given a BibleBook, get the previous BibleBook in this ReferenceSystem. If it is the first book, return null.
+     * @param book A BibleBook in the ReferenceSystem
+     * @return the previous BibleBook or null.
+     */
+    public BibleBook getPreviousBook(BibleBook book) {
+        int ordinal = book.ordinal();
+        int position = bookMap[ordinal];
+        if (position > 0) {
+            return books[position - 1];
+        }
+
+        return null;
+    }
+
+    /**
+     * Given a BibleBook, get the next BibleBook in this ReferenceSystem. If it is the last book, return null.
+     * @param book A BibleBook in the ReferenceSystem
+     * @return the previous BibleBook or null.
+     */
+    public BibleBook getNextBook(BibleBook book) {
+        int ordinal = book.ordinal();
+        int position = bookMap[ordinal];
+        if (position != -1 && position + 1 < books.length) {
+            return books[position + 1];
+        }
+        return null;
+    }
+
+    /**
+     * The bookMap contains one slot for every BibleBook, indexed by it's ordinal value.
+     * The value of that entry is the position of the book in the BookList.
+     * If the BibleBook is not present in books, it's value is -1.
+     */
+    private void initialize() {
+        bookMap = new int[BibleBook.values().length + 1];
+        // Initialize all slots to -1
+        for (BibleBook b : BibleBook.values()) {
+            bookMap[b.ordinal()] = -1;
+        }
+        
+        // Fill in the position of the books into that list
+        for (int i = 0; i < books.length; i++) {
+            bookMap[books[i].ordinal()] = i;
+        }
+    }
+
+    private BibleBook[] books;
+    
+    /** The bookMap maps from a BibleBook to the position that book has in <code>books</code>. */
+    transient private int bookMap[];
+
+}


Property changes on: trunk/jsword/src/main/java/org/crosswire/jsword/versification/BibleBookList.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:keywords
   + Id
Added: svn:eol-style
   + native

Modified: trunk/jsword/src/main/java/org/crosswire/jsword/versification/BibleInfo.java
===================================================================
--- trunk/jsword/src/main/java/org/crosswire/jsword/versification/BibleInfo.java	2012-01-14 14:06:50 UTC (rev 2209)
+++ trunk/jsword/src/main/java/org/crosswire/jsword/versification/BibleInfo.java	2012-01-14 14:10:44 UTC (rev 2210)
@@ -23,7 +23,6 @@
 
 import java.io.PrintStream;
 
-import org.crosswire.jsword.JSMsg;
 import org.crosswire.jsword.JSOtherMsg;
 import org.crosswire.jsword.book.CaseType;
 import org.crosswire.jsword.passage.NoSuchVerseException;
@@ -35,7 +34,7 @@
  * <p>This class is likely to be reworked in it's entirety. It is really only true
  * of the KJV Bible. It is not true of other versifications such as Luther's.
  * </p>
- * 
+ *
  * @see gnu.lgpl.License for license details.<br>
  *      The copyright to this program is held by it's authors.
  * @author Joe Walker [joe at eireneh dot com]
@@ -64,7 +63,7 @@
      * @return the next book or null if no following book
      */
     public static BibleBook getNextBook(BibleBook book) {
-        return book.next();
+        return referenceSystem.getBooks().getNextBook(book);
     }
 
     /**
@@ -73,13 +72,13 @@
      * @return the previous book or null if no previous book
      */
     public static BibleBook getPreviousBook(BibleBook book) {
-        return book.previous();
+        return referenceSystem.getBooks().getPreviousBook(book);
     }
 
     /**
      * Get the ordered array of books belonging to this versification.
      * This includes the 3 introductions.
-     * 
+     *
      * @return the array of books
      */
     public static BibleBook[] getBooks() {
@@ -88,27 +87,18 @@
 
     /**
      * Get the last valid chapter number for a book.
-     * 
+     *
      * @param book
      *            The book part of the reference.
      * @return The last valid chapter number for a book.
      */
     public static int chaptersInBook(BibleBook book) {
-        // This is faster than doing the check explicitly, unless
-        // The exception is actually thrown, then it is a lot slower
-        // I'd like to think that the norm is to get it right
-        try {
-            return VERSES_IN_CHAPTER[book.ordinal()].length - 1;
-        } catch (NullPointerException ex) {
-            return 0;
-        } catch (ArrayIndexOutOfBoundsException ex) {
-            return 0;
-        }
+        return referenceSystem.getLastChapter(book);
     }
 
     /**
      * Get the last valid verse number for a chapter.
-     * 
+     *
      * @param book
      *            The book part of the reference.
      * @param chapter
@@ -117,27 +107,16 @@
      *                If the book or chapter number is not valid
      */
     public static int versesInChapter(BibleBook book, int chapter) {
-        // This is faster than doing the check explicitly, unless
-        // The exception is actually thrown, then it is a lot slower
-        // I'd like to think that the norm is to get it right
-        try {
-            return VERSES_IN_CHAPTER[book.ordinal()][chapter];
-        } catch (NullPointerException ex) {
-            return 0;
-        } catch (ArrayIndexOutOfBoundsException ex) {
-            return 0;
-        }
+        return referenceSystem.getLastVerse(book, chapter);
     }
 
     /**
      * The maximum number of verses in the Bible, including module, testament, book and chapter introductions.
-     * 
+     *
      * @return the number of addressable verses in this versification.
      */
     public static int maximumOrdinal() {
-        // The sentinel value in ORDINAL_AT_START_OF_CHAPTER points to what would be the book introduction
-        // of the book following the last book in the NT, typically REV.
-        return ORDINAL_AT_START_OF_CHAPTER[ORDINAL_AT_START_OF_CHAPTER.length - 1][0] - 1;
+        return referenceSystem.maximumOrdinal();
     }
 
     /**
@@ -161,13 +140,13 @@
      * <li>n + 4 - Matt 1:1</li>
      * <li>...</li>
      * </ul>
-     * 
+     *
      * @param verse
      *            The verse to convert
      * @return The ordinal number of verses
      */
     public static int getOrdinal(Verse verse) {
-        return ORDINAL_AT_START_OF_CHAPTER[verse.getBook().ordinal()][verse.getChapter()] + verse.getVerse();
+        return referenceSystem.getOrdinal(verse);
     }
 
     /**
@@ -191,53 +170,35 @@
      * <li>3 - Matt 1:1</li>
      * <li>...</li>
      * </ul>
-     * 
+     *
      * @param verse
      *            The verse to convert
      * @return The ordinal number of verses
      */
     public static int getTestamentOrdinal(int ordinal) {
-        int nt_ordinal = ORDINAL_AT_START_OF_CHAPTER[BibleBook.INTRO_NT.ordinal()][0];
-        if (ordinal >= nt_ordinal) {
-            return ordinal - nt_ordinal + 1;
-        }
-        return ordinal;
+        return referenceSystem.getTestamentOrdinal(ordinal);
     }
 
     /**
      * Get the testament of a given verse
      */
     public static Testament getTestament(int ordinal) {
-        if (ordinal >= ORDINAL_AT_START_OF_CHAPTER[BibleBook.INTRO_NT.ordinal()][0]) {
-            // This is an NT verse
-            return Testament.NEW;
-        }
-        // This is an OT verse
-        return Testament.OLD;
+        return referenceSystem.getTestament(ordinal);
     }
 
     /**
      * Give the count of verses in the testament or the whole Bible.
-     * 
+     *
      * @param testament The testament to count. If null, then all testaments.
      * @return the number of verses in the testament
      */
     public static int getCount(Testament testament) {
-        // The sentinel give the total verses in the Bible
-        int total = ORDINAL_AT_START_OF_CHAPTER[ORDINAL_AT_START_OF_CHAPTER.length - 1][0];
-        if (testament == null) {
-            return total;
-        }
-        // The ordinal for the NT Intro is the count of the OT verses
-        int otCount = ORDINAL_AT_START_OF_CHAPTER[BibleBook.INTRO_NT.ordinal()][0];
-        if (testament == Testament.OLD) {
-            return otCount;
-        }
-        return total - otCount;
+        return referenceSystem.getCount(testament);
     }
+
     /**
      * Where does this verse come in the Bible. This will unwind the value returned by getOrdinal(Verse).
-     * 
+     *
      * @param ordinal
      *            The ordinal number of the verse
      * @return A Verse
@@ -245,66 +206,7 @@
      *                If the reference is illegal
      */
     public static Verse decodeOrdinal(int ordinal) {
-        int ord = ordinal;
-        BibleBook book = null;
-        int bookIndex = -1;
-        int chapterIndex = 0;
-        int verse = 0;
-
-        if (ord < 0) {
-            ord = 0;
-        } else if (ord > maximumOrdinal()) {
-            ord = maximumOrdinal();
-        }
-
-        // Handle three special cases
-        // Book/Module introduction
-        if (ord == 0) {
-            return new Verse(BibleBook.INTRO_BIBLE, 0, 0);
-        }
-
-        // OT introduction
-        if (ord == 1) {
-            return new Verse(BibleBook.INTRO_OT, 0, 0);
-        }
-
-        // NT introduction
-        if (ord == NT_ORDINAL_START) {
-            return new Verse(BibleBook.INTRO_NT, 0, 0);
-        }
-
-        // The ORDINAL_AT_START_OF_CHAPTER has a sentinel value at the end of the array
-        // Therefore, subtract  1
-        int lastBook = ORDINAL_AT_START_OF_CHAPTER.length - 1;
-        for (int b = lastBook; b >= 0; b--) {
-            // A book has a slot for a heading followed by a slot for a chapter heading.
-            // These precede the start of the chapter.
-            if (ord >= ORDINAL_AT_START_OF_CHAPTER[b][0]) {
-                bookIndex = b;
-                break;
-            }
-        }
-
-        // There is a gap for the New Testament introduction.
-        // This occurs when ordinal is one less than the book introduction of the next book.
-//        if (bookIndex == BibleBook.INTRO_NT.ordinal() - 1 && ord == ORDINAL_AT_START_OF_CHAPTER[bookIndex + 1][0] - 1) {
-//            bookIndex++;
-//        }
-
-        book = BibleBook.getBooks()[bookIndex];
-        int cib = BibleInfo.chaptersInBook(book);
-        for (int c = cib; c >= 0; c--) {
-            if (ord >= ORDINAL_AT_START_OF_CHAPTER[bookIndex][c]) {
-                chapterIndex = c;
-                break;
-            }
-        }
-
-        if (chapterIndex > 0) {
-            verse = ord - ORDINAL_AT_START_OF_CHAPTER[bookIndex][chapterIndex];
-        }
-        
-        return new Verse(book, chapterIndex, verse);
+        return referenceSystem.decodeOrdinal(ordinal);
     }
 
     /**
@@ -312,7 +214,7 @@
      * makes me wonder if I18 is done well/worth doing. All this code does is
      * check if the numbers are valid, but the exception handling code is huge
      * :(
-     * 
+     *
      * @param book
      *            The book part of the reference.
      * @param chapter
@@ -323,39 +225,7 @@
      *                If the reference is illegal
      */
     public static void validate(BibleBook book, int chapter, int verse) throws NoSuchVerseException {
-
-        // Check the book
-        if (book == null) {
-            // TRANSLATOR: The user did not supply a book for a verse reference.
-            throw new NoSuchVerseException(JSOtherMsg.lookupText("Book must not be null"));
-        }
-
-        // Check the chapter
-        int maxChapter = chaptersInBook(book);
-        if (chapter < 0 || chapter > maxChapter) {
-            // TRANSLATOR: The user supplied a chapter that was out of bounds. This tells them what is allowed.
-            // {0} is the lowest value that is allowed. This is always 0.
-            // {1,number,integer} is the place holder for the highest chapter number in the book. The format is special in that it will present it in the user's preferred format.
-            // {2} is a placeholder for the Bible book name.
-            // {3,number,integer} is a placeholder for the chapter number that the user gave.
-            throw new NoSuchVerseException(JSMsg.gettext("Chapter should be between {0} and {1,number,integer} for {2} (given {3,number,integer}).",
-                    Integer.valueOf(0), Integer.valueOf(maxChapter), book.getPreferredName(), Integer.valueOf(chapter)
-                    ));
-        }
-
-        // Check the verse
-        int maxVerse = versesInChapter(book, chapter);
-        if (verse < 0 || verse > maxVerse) {
-            // TRANSLATOR: The user supplied a verse number that was out of bounds. This tells them what is allowed.
-            // {0} is the lowest value that is allowed. This is always 0.
-            // {1,number,integer} is the place holder for the highest verse number in the chapter. The format is special in that it will present it in the user's preferred format.
-            // {2} is a placeholder for the Bible book name.
-            // {3,number,integer} is a placeholder for the chapter number that the user gave.
-            // {4,number,integer} is a placeholder for the verse number that the user gave.
-            throw new NoSuchVerseException(JSMsg.gettext("Verse should be between {0} and {1,number,integer} for {2} {3,number,integer} (given {4,number,integer}).",
-                    Integer.valueOf(0), Integer.valueOf(maxVerse), book.getPreferredName(), Integer.valueOf(chapter), Integer.valueOf(verse)
-                    ));
-        }
+        referenceSystem.validate(book, chapter, verse);
     }
 
     /**
@@ -380,142 +250,480 @@
      * expecting us to type "Psa 999:1" seems like we're getting silly.
      * <p>
      * However despite this maybe we should provide the functionality anyway.
-     * 
+     *
      * @param book the book to obtain
      * @param chapter the supposed chapter
      * @param verse the supposed verse
      * @return The resultant verse.
      */
     public static Verse patch(BibleBook book, int chapter, int verse) {
-        BibleBook patchedBook = book;
-        int patchedChapter = chapter;
-        int patchedVerse = verse;
-        
-        // If the book is null, then patch to GENESIS
-        if (patchedBook == null) {
-            patchedBook = BibleBook.GEN;
-        }
-        // If they are too small
-        if (patchedChapter < 0) {
-            patchedChapter = 0;
-        }
-        if (patchedVerse < 0) {
-            patchedVerse = 0;
-        }
-
-        while (patchedChapter > chaptersInBook(patchedBook)) {
-            patchedChapter -= chaptersInBook(patchedBook);
-            patchedBook = BibleInfo.getNextBook(patchedBook);
-
-            if (patchedBook == null) {
-                patchedBook = BibleBook.REV;
-                patchedChapter = chaptersInBook(patchedBook);
-                patchedVerse = versesInChapter(patchedBook, patchedChapter);
-                return new Verse(patchedBook, patchedChapter, patchedVerse);
-            }
-        }
-
-        while (patchedVerse > versesInChapter(patchedBook, patchedChapter)) {
-            patchedVerse -= versesInChapter(patchedBook, patchedChapter);
-            patchedChapter += 1;
-
-            if (patchedChapter > chaptersInBook(patchedBook)) {
-                patchedChapter -= chaptersInBook(patchedBook);
-                patchedBook = BibleInfo.getNextBook(patchedBook);
-
-                if (patchedBook == null) {
-                    patchedBook = BibleBook.REV;
-                    patchedChapter = chaptersInBook(patchedBook);
-                    patchedVerse = versesInChapter(patchedBook, patchedChapter);
-                    return new Verse(patchedBook, patchedChapter, patchedVerse);
-                }
-            }
-        }
-
-        return new Verse(patchedBook, patchedChapter, patchedVerse);
+        return referenceSystem.patch(book, chapter, verse);
     }
 
     /**
      * Count the books in the Bible.
-     * 
+     *
      * @return The number of books in the Bible, including the three introductions
      */
     public static int booksInBible() {
-        return ORDINAL_AT_START_OF_CHAPTER.length - 1;
+        return referenceSystem.getBooks().getBookCount();
     }
 
+    /** The OSIS name of the reference system. */
+    public static String osisName = "KJV";
+
+    /** The ordered list of BibleBooks */
+    public static BibleBook[] kjvBooks =
+    {
+        // JSword introduction to the Bible
+        BibleBook.INTRO_BIBLE,
+        // JSword introduction to the Old Testament
+        BibleBook.INTRO_OT,
+        // Old Testament
+        BibleBook.GEN,
+        BibleBook.EXOD,
+        BibleBook.LEV,
+        BibleBook.NUM,
+        BibleBook.DEUT,
+        BibleBook.JOSH,
+        BibleBook.JUDG,
+        BibleBook.RUTH,
+        BibleBook.SAM1,
+        BibleBook.SAM2,
+        BibleBook.KGS1,
+        BibleBook.KGS2,
+        BibleBook.CHR1,
+        BibleBook.CHR2,
+        BibleBook.EZRA,
+        BibleBook.NEH,
+        BibleBook.ESTH,
+        BibleBook.JOB,
+        BibleBook.PS,
+        BibleBook.PROV,
+        BibleBook.ECCL,
+        BibleBook.SONG,
+        BibleBook.ISA,
+        BibleBook.JER,
+        BibleBook.LAM,
+        BibleBook.EZEK,
+        BibleBook.DAN,
+        BibleBook.HOS,
+        BibleBook.JOEL,
+        BibleBook.AMOS,
+        BibleBook.OBAD,
+        BibleBook.JONAH,
+        BibleBook.MIC,
+        BibleBook.NAH,
+        BibleBook.HAB,
+        BibleBook.ZEPH,
+        BibleBook.HAG,
+        BibleBook.ZECH,
+        BibleBook.MAL,
+        // JSword introduction to the New Testament
+        BibleBook.INTRO_NT,
+        // New Testament
+        BibleBook.MATT,
+        BibleBook.MARK,
+        BibleBook.LUKE,
+        BibleBook.JOHN,
+        BibleBook.ACTS,
+        BibleBook.ROM,
+        BibleBook.COR1,
+        BibleBook.COR2,
+        BibleBook.GAL,
+        BibleBook.EPH,
+        BibleBook.PHIL,
+        BibleBook.COL,
+        BibleBook.THESS1,
+        BibleBook.THESS2,
+        BibleBook.TIM1,
+        BibleBook.TIM2,
+        BibleBook.TITUS,
+        BibleBook.PHLM,
+        BibleBook.HEB,
+        BibleBook.JAS,
+        BibleBook.PET1,
+        BibleBook.PET2,
+        BibleBook.JOHN1,
+        BibleBook.JOHN2,
+        BibleBook.JOHN3,
+        BibleBook.JUDE,
+        BibleBook.REV,
+    };
+
     /** Constant for the max verse number in each chapter */
-    private static final int[][] VERSES_IN_CHAPTER =
+    public static final int[][] kjvLastVerse =
     {
-        {  0 },
-        {  0 },
-        {  0, 31, 25, 24, 26, 32, 22, 24, 22, 29, 32, 32, 20, 18, 24, 21, 16, 27, 33, 38, 18, 34, 24, 20, 67, 34, 35, 46, 22, 35, 43, 55, 32, 20, 31, 29, 43, 36, 30, 23, 23, 57, 38, 34, 34, 28, 34, 31, 22, 33, 26 },
-        {  0, 22, 25, 22, 31, 23, 30, 25, 32, 35, 29, 10, 51, 22, 31, 27, 36, 16, 27, 25, 26, 36, 31, 33, 18, 40, 37, 21, 43, 46, 38, 18, 35, 23, 35, 35, 38, 29, 31, 43, 38 },
-        {  0, 17, 16, 17, 35, 19, 30, 38, 36, 24, 20, 47,  8, 59, 57, 33, 34, 16, 30, 37, 27, 24, 33, 44, 23, 55, 46, 34 },
-        {  0, 54, 34, 51, 49, 31, 27, 89, 26, 23, 36, 35, 16, 33, 45, 41, 50, 13, 32, 22, 29, 35, 41, 30, 25, 18, 65, 23, 31, 40, 16, 54, 42, 56, 29, 34, 13 },
-        {  0, 46, 37, 29, 49, 33, 25, 26, 20, 29, 22, 32, 32, 18, 29, 23, 22, 20, 22, 21, 20, 23, 30, 25, 22, 19, 19, 26, 68, 29, 20, 30, 52, 29, 12 },
-        {  0, 18, 24, 17, 24, 15, 27, 26, 35, 27, 43, 23, 24, 33, 15, 63, 10, 18, 28, 51,  9, 45, 34, 16, 33 },
-        {  0, 36, 23, 31, 24, 31, 40, 25, 35, 57, 18, 40, 15, 25, 20, 20, 31, 13, 31, 30, 48, 25 },
-        {  0, 22, 23, 18, 22 },
-        {  0, 28, 36, 21, 22, 12, 21, 17, 22, 27, 27, 15, 25, 23, 52, 35, 23, 58, 30, 24, 42, 15, 23, 29, 22, 44, 25, 12, 25, 11, 31, 13 },
-        {  0, 27, 32, 39, 12, 25, 23, 29, 18, 13, 19, 27, 31, 39, 33, 37, 23, 29, 33, 43, 26, 22, 51, 39, 25 },
-        {  0, 53, 46, 28, 34, 18, 38, 51, 66, 28, 29, 43, 33, 34, 31, 34, 34, 24, 46, 21, 43, 29, 53 },
-        {  0, 18, 25, 27, 44, 27, 33, 20, 29, 37, 36, 21, 21, 25, 29, 38, 20, 41, 37, 37, 21, 26, 20, 37, 20, 30 },
-        {  0, 54, 55, 24, 43, 26, 81, 40, 40, 44, 14, 47, 40, 14, 17, 29, 43, 27, 17, 19,  8, 30, 19, 32, 31, 31, 32, 34, 21, 30 },
-        {  0, 17, 18, 17, 22, 14, 42, 22, 18, 31, 19, 23, 16, 22, 15, 19, 14, 19, 34, 11, 37, 20, 12, 21, 27, 28, 23,  9, 27, 36, 27, 21, 33, 25, 33, 27, 23 },
-        {  0, 11, 70, 13, 24, 17, 22, 28, 36, 15, 44 },
-        {  0, 11, 20, 32, 23, 19, 19, 73, 18, 38, 39, 36, 47, 31 },
-        {  0, 22, 23, 15, 17, 14, 14, 10, 17, 32,  3 },
-        {  0, 22, 13, 26, 21, 27, 30, 21, 22, 35, 22, 20, 25, 28, 22, 35, 22, 16, 21, 29, 29, 34, 30, 17, 25,  6, 14, 23, 28, 25, 31, 40, 22, 33, 37, 16, 33, 24, 41, 30, 24, 34, 17 },
-        {  0,  6, 12,  8,  8, 12, 10, 17,  9, 20, 18,  7,  8,  6,  7,  5, 11, 15, 50, 14,  9, 13, 31,  6, 10, 22, 12, 14,  9, 11, 12, 24, 11, 22, 22, 28, 12, 40, 22, 13, 17, 13, 11,  5, 26, 17, 11,  9, 14, 20, 23, 19,  9,  6,  7, 23, 13, 11, 11, 17, 12,  8, 12, 11, 10, 13, 20,  7, 35, 36,  5, 24, 20, 28, 23, 10, 12, 20, 72, 13, 19, 16,  8, 18, 12, 13, 17,  7, 18, 52, 17, 16, 15,  5, 23, 11, 13, 12,  9,  9,  5,  8, 28, 22, 35, 45, 48, 43, 13, 31,  7, 10, 10,  9,  8, 18, 19,  2, 29, 176,  7,  8,  9,  4,  8,  5,  6,  5,  6,  8,  8,  3, 18,  3,  3, 21, 26, 9,  8, 24, 13, 10,  7, 12, 15, 21, 10, 20, 14,  9,  6 },
-        {  0, 33, 22, 35, 27, 23, 35, 27, 36, 18, 32, 31, 28, 25, 35, 33, 33, 28, 24, 29, 30, 31, 29, 35, 34, 28, 28, 27, 28, 27, 33, 31 },
-        {  0, 18, 26, 22, 16, 20, 12, 29, 17, 18, 20, 10, 14 },
-        {  0, 17, 17, 11, 16, 16, 13, 13, 14 },
-        {  0, 31, 22, 26,  6, 30, 13, 25, 22, 21, 34, 16,  6, 22, 32,  9, 14, 14,  7, 25,  6, 17, 25, 18, 23, 12, 21, 13, 29, 24, 33,  9, 20, 24, 17, 10, 22, 38, 22,  8, 31, 29, 25, 28, 28, 25, 13, 15, 22, 26, 11, 23, 15, 12, 17, 13, 12, 21, 14, 21, 22, 11, 12, 19, 12, 25, 24 },
-        {  0, 19, 37, 25, 31, 31, 30, 34, 22, 26, 25, 23, 17, 27, 22, 21, 21, 27, 23, 15, 18, 14, 30, 40, 10, 38, 24, 22, 17, 32, 24, 40, 44, 26, 22, 19, 32, 21, 28, 18, 16, 18, 22, 13, 30,  5, 28,  7, 47, 39, 46, 64, 34 },
-        {  0, 22, 22, 66, 22, 22 },
-        {  0, 28, 10, 27, 17, 17, 14, 27, 18, 11, 22, 25, 28, 23, 23,  8, 63, 24, 32, 14, 49, 32, 31, 49, 27, 17, 21, 36, 26, 21, 26, 18, 32, 33, 31, 15, 38, 28, 23, 29, 49, 26, 20, 27, 31, 25, 24, 23, 35 },
-        {  0, 21, 49, 30, 37, 31, 28, 28, 27, 27, 21, 45, 13 },
-        {  0, 11, 23,  5, 19, 15, 11, 16, 14, 17, 15, 12, 14, 16,  9 },
-        {  0, 20, 32, 21 },
-        {  0, 15, 16, 15, 13, 27, 14, 17, 14, 15 },
-        {  0, 21 },
-        {  0, 17, 10, 10, 11 },
-        {  0, 16, 13, 12, 13, 15, 16, 20 },
-        {  0, 15, 13, 19 },
-        {  0, 17, 20, 19 },
-        {  0, 18, 15, 20 },
-        {  0, 15, 23 },
-        {  0, 21, 13, 10, 14, 11, 15, 14, 23, 17, 12, 17, 14,  9, 21 },
-        {  0, 14, 17, 18,  6 },
-        {  0 },
-        {  0, 25, 23, 17, 25, 48, 34, 29, 34, 38, 42, 30, 50, 58, 36, 39, 28, 27, 35, 30, 34, 46, 46, 39, 51, 46, 75, 66, 20 },
-        {  0, 45, 28, 35, 41, 43, 56, 37, 38, 50, 52, 33, 44, 37, 72, 47, 20 },
-        {  0, 80, 52, 38, 44, 39, 49, 50, 56, 62, 42, 54, 59, 35, 35, 32, 31, 37, 43, 48, 47, 38, 71, 56, 53 },
-        {  0, 51, 25, 36, 54, 47, 71, 53, 59, 41, 42, 57, 50, 38, 31, 27, 33, 26, 40, 42, 31, 25 },
-        {  0, 26, 47, 26, 37, 42, 15, 60, 40, 43, 48, 30, 25, 52, 28, 41, 40, 34, 28, 41, 38, 40, 30, 35, 27, 27, 32, 44, 31 },
-        {  0, 32, 29, 31, 25, 21, 23, 25, 39, 33, 21, 36, 21, 14, 23, 33, 27 },
-        {  0, 31, 16, 23, 21, 13, 20, 40, 13, 27, 33, 34, 31, 13, 40, 58, 24 },
-        {  0, 24, 17, 18, 18, 21, 18, 16, 24, 15, 18, 33, 21, 14 },
-        {  0, 24, 21, 29, 31, 26, 18 },
-        {  0, 23, 22, 21, 32, 33, 24 },
-        {  0, 30, 30, 21, 23 },
-        {  0, 29, 23, 25, 18 },
-        {  0, 10, 20, 13, 18, 28 },
-        {  0, 12, 17, 18 },
-        {  0, 20, 15, 16, 16, 25, 21 },
-        {  0, 18, 26, 17, 22 },
-        {  0, 16, 15, 15 },
-        {  0, 25 },
-        {  0, 14, 18, 19, 16, 14, 20, 28, 13, 28, 39, 40, 29, 25 },
-        {  0, 27, 26, 18, 17, 20 },
-        {  0, 25, 25, 22, 19, 14 },
-        {  0, 21, 22, 18 },
-        {  0, 10, 29, 24, 21, 21 },
-        {  0, 13 },
-        {  0, 14 },
-        {  0, 25 },
-        {  0, 20, 29, 22, 11, 14, 17, 17, 13, 21, 11, 19, 17, 18, 20,  8, 21, 18, 24, 21, 15, 27, 21 },
+        // Bible Introduction
+        {
+                0,
+        },
+        // Old Testament Introduction
+        {
+                0,
+        },
+        // Gen
+        {
+                0,    31,    25,    24,    26,    32,    22,    24,    22,    29,
+               32,    32,    20,    18,    24,    21,    16,    27,    33,    38,
+               18,    34,    24,    20,    67,    34,    35,    46,    22,    35,
+               43,    55,    32,    20,    31,    29,    43,    36,    30,    23,
+               23,    57,    38,    34,    34,    28,    34,    31,    22,    33,
+               26,
+        },
+        // Exod
+        {
+                0,    22,    25,    22,    31,    23,    30,    25,    32,    35,
+               29,    10,    51,    22,    31,    27,    36,    16,    27,    25,
+               26,    36,    31,    33,    18,    40,    37,    21,    43,    46,
+               38,    18,    35,    23,    35,    35,    38,    29,    31,    43,
+               38,
+        },
+        // Lev
+        {
+                0,    17,    16,    17,    35,    19,    30,    38,    36,    24,
+               20,    47,     8,    59,    57,    33,    34,    16,    30,    37,
+               27,    24,    33,    44,    23,    55,    46,    34,
+        },
+        // Num
+        {
+                0,    54,    34,    51,    49,    31,    27,    89,    26,    23,
+               36,    35,    16,    33,    45,    41,    50,    13,    32,    22,
+               29,    35,    41,    30,    25,    18,    65,    23,    31,    40,
+               16,    54,    42,    56,    29,    34,    13,
+        },
+        // Deut
+        {
+                0,    46,    37,    29,    49,    33,    25,    26,    20,    29,
+               22,    32,    32,    18,    29,    23,    22,    20,    22,    21,
+               20,    23,    30,    25,    22,    19,    19,    26,    68,    29,
+               20,    30,    52,    29,    12,
+        },
+        // Josh
+        {
+                0,    18,    24,    17,    24,    15,    27,    26,    35,    27,
+               43,    23,    24,    33,    15,    63,    10,    18,    28,    51,
+                9,    45,    34,    16,    33,
+        },
+        // Judg
+        {
+                0,    36,    23,    31,    24,    31,    40,    25,    35,    57,
+               18,    40,    15,    25,    20,    20,    31,    13,    31,    30,
+               48,    25,
+        },
+        // Ruth
+        {
+                0,    22,    23,    18,    22,
+        },
+        // 1Sam
+        {
+                0,    28,    36,    21,    22,    12,    21,    17,    22,    27,
+               27,    15,    25,    23,    52,    35,    23,    58,    30,    24,
+               42,    15,    23,    29,    22,    44,    25,    12,    25,    11,
+               31,    13,
+        },
+        // 2Sam
+        {
+                0,    27,    32,    39,    12,    25,    23,    29,    18,    13,
+               19,    27,    31,    39,    33,    37,    23,    29,    33,    43,
+               26,    22,    51,    39,    25,
+        },
+        // 1Kgs
+        {
+                0,    53,    46,    28,    34,    18,    38,    51,    66,    28,
+               29,    43,    33,    34,    31,    34,    34,    24,    46,    21,
+               43,    29,    53,
+        },
+        // 2Kgs
+        {
+                0,    18,    25,    27,    44,    27,    33,    20,    29,    37,
+               36,    21,    21,    25,    29,    38,    20,    41,    37,    37,
+               21,    26,    20,    37,    20,    30,
+        },
+        // 1Chr
+        {
+                0,    54,    55,    24,    43,    26,    81,    40,    40,    44,
+               14,    47,    40,    14,    17,    29,    43,    27,    17,    19,
+                8,    30,    19,    32,    31,    31,    32,    34,    21,    30,
+        },
+        // 2Chr
+        {
+                0,    17,    18,    17,    22,    14,    42,    22,    18,    31,
+               19,    23,    16,    22,    15,    19,    14,    19,    34,    11,
+               37,    20,    12,    21,    27,    28,    23,     9,    27,    36,
+               27,    21,    33,    25,    33,    27,    23,
+        },
+        // Ezra
+        {
+                0,    11,    70,    13,    24,    17,    22,    28,    36,    15,
+               44,
+        },
+        // Neh
+        {
+                0,    11,    20,    32,    23,    19,    19,    73,    18,    38,
+               39,    36,    47,    31,
+        },
+        // Esth
+        {
+                0,    22,    23,    15,    17,    14,    14,    10,    17,    32,
+                3,
+        },
+        // Job
+        {
+                0,    22,    13,    26,    21,    27,    30,    21,    22,    35,
+               22,    20,    25,    28,    22,    35,    22,    16,    21,    29,
+               29,    34,    30,    17,    25,     6,    14,    23,    28,    25,
+               31,    40,    22,    33,    37,    16,    33,    24,    41,    30,
+               24,    34,    17,
+        },
+        // Ps
+        {
+                0,     6,    12,     8,     8,    12,    10,    17,     9,    20,
+               18,     7,     8,     6,     7,     5,    11,    15,    50,    14,
+                9,    13,    31,     6,    10,    22,    12,    14,     9,    11,
+               12,    24,    11,    22,    22,    28,    12,    40,    22,    13,
+               17,    13,    11,     5,    26,    17,    11,     9,    14,    20,
+               23,    19,     9,     6,     7,    23,    13,    11,    11,    17,
+               12,     8,    12,    11,    10,    13,    20,     7,    35,    36,
+                5,    24,    20,    28,    23,    10,    12,    20,    72,    13,
+               19,    16,     8,    18,    12,    13,    17,     7,    18,    52,
+               17,    16,    15,     5,    23,    11,    13,    12,     9,     9,
+                5,     8,    28,    22,    35,    45,    48,    43,    13,    31,
+                7,    10,    10,     9,     8,    18,    19,     2,    29,   176,
+                7,     8,     9,     4,     8,     5,     6,     5,     6,     8,
+                8,     3,    18,     3,     3,    21,    26,     9,     8,    24,
+               13,    10,     7,    12,    15,    21,    10,    20,    14,     9,
+                6,
+        },
+        // Prov
+        {
+                0,    33,    22,    35,    27,    23,    35,    27,    36,    18,
+               32,    31,    28,    25,    35,    33,    33,    28,    24,    29,
+               30,    31,    29,    35,    34,    28,    28,    27,    28,    27,
+               33,    31,
+        },
+        // Eccl
+        {
+                0,    18,    26,    22,    16,    20,    12,    29,    17,    18,
+               20,    10,    14,
+        },
+        // Song
+        {
+                0,    17,    17,    11,    16,    16,    13,    13,    14,
+        },
+        // Isa
+        {
+                0,    31,    22,    26,     6,    30,    13,    25,    22,    21,
+               34,    16,     6,    22,    32,     9,    14,    14,     7,    25,
+                6,    17,    25,    18,    23,    12,    21,    13,    29,    24,
+               33,     9,    20,    24,    17,    10,    22,    38,    22,     8,
+               31,    29,    25,    28,    28,    25,    13,    15,    22,    26,
+               11,    23,    15,    12,    17,    13,    12,    21,    14,    21,
+                      22,    11,    12,    19,    12,    25,    24,
+        },
+        // Jer
+        {
+                0,    19,    37,    25,    31,    31,    30,    34,    22,    26,
+               25,    23,    17,    27,    22,    21,    21,    27,    23,    15,
+               18,    14,    30,    40,    10,    38,    24,    22,    17,    32,
+               24,    40,    44,    26,    22,    19,    32,    21,    28,    18,
+               16,    18,    22,    13,    30,     5,    28,     7,    47,    39,
+               46,    64,    34,
+        },
+        // Lam
+        {
+            0,    22,    22,    66,    22,    22,
+        },
+        // Ezek
+        {
+                0,    28,    10,    27,    17,    17,    14,    27,    18,    11,
+               22,    25,    28,    23,    23,     8,    63,    24,    32,    14,
+               49,    32,    31,    49,    27,    17,    21,    36,    26,    21,
+               26,    18,    32,    33,    31,    15,    38,    28,    23,    29,
+               49,    26,    20,    27,    31,    25,    24,    23,    35,
+        },
+        // Dan
+        {
+                0,    21,    49,    30,    37,    31,    28,    28,    27,    27,
+               21,    45,    13,
+        },
+        // Hos
+        {
+                0,    11,    23,     5,    19,    15,    11,    16,    14,    17,
+               15,    12,    14,    16,     9,
+        },
+        // Joel
+        {
+                0,    20,    32,    21,
+        },
+        // Amos
+        {
+                0,    15,    16,    15,    13,    27,    14,    17,    14,    15,
+        },
+        // Obad
+        {
+                0,    21,
+        },
+        // Jonah
+        {
+                0,    17,    10,    10,    11,
+        },
+        // Mic
+        {
+                0,    16,    13,    12,    13,    15,    16,    20,
+        },
+        // Nah
+        {
+                0,    15,    13,    19,
+        },
+        // Hab
+        {
+                0,    17,    20,    19,
+        },
+        // Zeph
+        {
+                0,    18,    15,    20,
+        },
+        // Hag
+        {
+                0,    15,    23,
+        },
+        // Zech
+        {
+                0,    21,    13,    10,    14,    11,    15,    14,    23,    17,
+               12,    17,    14,     9,    21,
+        },
+        // Mal
+        {
+                0,    14,    17,    18,     6,
+        },
+        // New Testament Introduction
+        {
+                0,
+        },
+        // Matt
+        {
+                0,    25,    23,    17,    25,    48,    34,    29,    34,    38,
+               42,    30,    50,    58,    36,    39,    28,    27,    35,    30,
+               34,    46,    46,    39,    51,    46,    75,    66,    20,
+        },
+        // Mark
+        {
+                0,    45,    28,    35,    41,    43,    56,    37,    38,    50,
+               52,    33,    44,    37,    72,    47,    20,
+        },
+        // Luke
+        {
+                0,    80,    52,    38,    44,    39,    49,    50,    56,    62,
+               42,    54,    59,    35,    35,    32,    31,    37,    43,    48,
+               47,    38,    71,    56,    53,
+        },
+        // John
+        {
+                0,    51,    25,    36,    54,    47,    71,    53,    59,    41,
+               42,    57,    50,    38,    31,    27,    33,    26,    40,    42,
+               31,    25,
+        },
+        // Acts
+        {
+                0,    26,    47,    26,    37,    42,    15,    60,    40,    43,
+               48,    30,    25,    52,    28,    41,    40,    34,    28,    41,
+               38,    40,    30,    35,    27,    27,    32,    44,    31,
+        },
+        // Rom
+        {
+                0,    32,    29,    31,    25,    21,    23,    25,    39,    33,
+               21,    36,    21,    14,    23,    33,    27,
+        },
+        // 1Cor
+        {
+                0,    31,    16,    23,    21,    13,    20,    40,    13,    27,
+               33,    34,    31,    13,    40,    58,    24,
+        },
+        // 2Cor
+        {
+                0,    24,    17,    18,    18,    21,    18,    16,    24,    15,
+               18,    33,    21,    14,
+        },
+        // Gal
+        {
+                0,    24,    21,    29,    31,    26,    18,
+        },
+        // Eph
+        {
+                0,    23,    22,    21,    32,    33,    24,
+        },
+        // Phil
+        {
+                0,    30,    30,    21,    23,
+        },
+        // Col
+        {
+                0,    29,    23,    25,    18,
+        },
+        // 1Thess
+        {
+                0,    10,    20,    13,    18,    28,
+        },
+        // 2Thess
+        {
+                0,    12,    17,    18,
+        },
+        // 1Tim
+        {
+                0,    20,    15,    16,    16,    25,    21,
+        },
+        // 2Tim
+        {
+                0,    18,    26,    17,    22,
+        },
+        // Titus
+        {
+                0,    16,    15,    15,
+        },
+        // Phlm
+        {
+                0,    25,
+        },
+        // Heb
+        {
+                0,    14,    18,    19,    16,    14,    20,    28,    13,    28,
+               39,    40,    29,    25,
+        },
+        // Jas
+        {
+                0,    27,    26,    18,    17,    20,
+        },
+        // 1Pet
+        {
+                0,    25,    25,    22,    19,    14,
+        },
+        // 2Pet
+        {
+                0,    21,    22,    18,
+        },
+        // 1John
+        {
+                0,    10,    29,    24,    21,    21,
+        },
+        // 2John
+        {
+                0,    13,
+        },
+        // 3John
+        {
+                0,    14,
+        },
+        // Jude
+        {
+                0,    25,
+        },
+        // Rev
+        {
+                0,    20,    29,    22,    11,    14,    17,    17,    13,    21,
+               11,    19,    17,    18,    20,     8,    21,    18,    24,    21,
+               15,    27,    21,
+        },
     };
 
     /**
@@ -523,385 +731,381 @@
      */
     // Note the sentinel at the end of the array is one greater
     // than the last ordinal in the last book
-    private static final int[][] ORDINAL_AT_START_OF_CHAPTER =
+    public static final int[][] kjvChapterStarts =
     {
         // Bible Introduction
         {
-            0,
+                0,
         },
         // Old Testament Introduction
         {
-            1,
+                1,
         },
         // Gen
-        { 
-                2,     3,    35,    61,    86,   113,   146,   169,   194,   217, 
-              247,   280,   313,   334,   353,   378,   400,   417,   445,   479, 
-              518,   537,   572,   597,   618,   686,   721,   757,   804,   827, 
-              863,   907,   963,   996,  1017,  1049,  1079,  1123,  1160,  1191, 
-             1215,  1239,  1297,  1336,  1371,  1406,  1435,  1470,  1502,  1525, 
-             1559, 
+        {
+                2,     3,    35,    61,    86,   113,   146,   169,   194,   217,
+              247,   280,   313,   334,   353,   378,   400,   417,   445,   479,
+              518,   537,   572,   597,   618,   686,   721,   757,   804,   827,
+              863,   907,   963,   996,  1017,  1049,  1079,  1123,  1160,  1191,
+             1215,  1239,  1297,  1336,  1371,  1406,  1435,  1470,  1502,  1525,
+             1559,
         },
         // Exod
-        { 
-             1586,  1587,  1610,  1636,  1659,  1691,  1715,  1746,  1772,  1805, 
-             1841,  1871,  1882,  1934,  1957,  1989,  2017,  2054,  2071,  2099, 
-             2125,  2152,  2189,  2221,  2255,  2274,  2315,  2353,  2375,  2419, 
-             2466,  2505,  2524,  2560,  2584,  2620,  2656,  2695,  2725,  2757, 
-             2801, 
+        {
+             1586,  1587,  1610,  1636,  1659,  1691,  1715,  1746,  1772,  1805,
+             1841,  1871,  1882,  1934,  1957,  1989,  2017,  2054,  2071,  2099,
+             2125,  2152,  2189,  2221,  2255,  2274,  2315,  2353,  2375,  2419,
+             2466,  2505,  2524,  2560,  2584,  2620,  2656,  2695,  2725,  2757,
+             2801,
         },
         // Lev
-        { 
-             2840,  2841,  2859,  2876,  2894,  2930,  2950,  2981,  3020,  3057, 
-             3082,  3103,  3151,  3160,  3220,  3278,  3312,  3347,  3364,  3395, 
-             3433,  3461,  3486,  3520,  3565,  3589,  3645,  3692, 
+        {
+             2840,  2841,  2859,  2876,  2894,  2930,  2950,  2981,  3020,  3057,
+             3082,  3103,  3151,  3160,  3220,  3278,  3312,  3347,  3364,  3395,
+             3433,  3461,  3486,  3520,  3565,  3589,  3645,  3692,
         },
         // Num
-        { 
-             3727,  3728,  3783,  3818,  3870,  3920,  3952,  3980,  4070,  4097, 
-             4121,  4158,  4194,  4211,  4245,  4291,  4333,  4384,  4398,  4431, 
-             4454,  4484,  4520,  4562,  4593,  4619,  4638,  4704,  4728,  4760, 
-             4801,  4818,  4873,  4916,  4973,  5003,  5038, 
+        {
+             3727,  3728,  3783,  3818,  3870,  3920,  3952,  3980,  4070,  4097,
+             4121,  4158,  4194,  4211,  4245,  4291,  4333,  4384,  4398,  4431,
+             4454,  4484,  4520,  4562,  4593,  4619,  4638,  4704,  4728,  4760,
+             4801,  4818,  4873,  4916,  4973,  5003,  5038,
         },
         // Deut
-        { 
-             5052,  5053,  5100,  5138,  5168,  5218,  5252,  5278,  5305,  5326, 
-             5356,  5379,  5412,  5445,  5464,  5494,  5518,  5541,  5562,  5585, 
-             5607,  5628,  5652,  5683,  5709,  5732,  5752,  5772,  5799,  5868, 
-             5898,  5919,  5950,  6003,  6033, 
+        {
+             5052,  5053,  5100,  5138,  5168,  5218,  5252,  5278,  5305,  5326,
+             5356,  5379,  5412,  5445,  5464,  5494,  5518,  5541,  5562,  5585,
+             5607,  5628,  5652,  5683,  5709,  5732,  5752,  5772,  5799,  5868,
+             5898,  5919,  5950,  6003,  6033,
         },
         // Josh
-        { 
-             6046,  6047,  6066,  6091,  6109,  6134,  6150,  6178,  6205,  6241, 
-             6269,  6313,  6337,  6362,  6396,  6412,  6476,  6487,  6506,  6535, 
-             6587,  6597,  6643,  6678,  6695, 
+        {
+             6046,  6047,  6066,  6091,  6109,  6134,  6150,  6178,  6205,  6241,
+             6269,  6313,  6337,  6362,  6396,  6412,  6476,  6487,  6506,  6535,
+             6587,  6597,  6643,  6678,  6695,
         },
         // Judg
-        { 
-             6729,  6730,  6767,  6791,  6823,  6848,  6880,  6921,  6947,  6983, 
-             7041,  7060,  7101,  7117,  7143,  7164,  7185,  7217,  7231,  7263, 
-             7294,  7343, 
+        {
+             6729,  6730,  6767,  6791,  6823,  6848,  6880,  6921,  6947,  6983,
+             7041,  7060,  7101,  7117,  7143,  7164,  7185,  7217,  7231,  7263,
+             7294,  7343,
         },
         // Ruth
-        { 
-             7369,  7370,  7393,  7417,  7436, 
+        {
+             7369,  7370,  7393,  7417,  7436,
         },
         // 1Sam
-        { 
-             7459,  7460,  7489,  7526,  7548,  7571,  7584,  7606,  7624,  7647, 
-             7675,  7703,  7719,  7745,  7769,  7822,  7858,  7882,  7941,  7972, 
-             7997,  8040,  8056,  8080,  8110,  8133,  8178,  8204,  8217,  8243, 
-             8255,  8287, 
+        {
+             7459,  7460,  7489,  7526,  7548,  7571,  7584,  7606,  7624,  7647,
+             7675,  7703,  7719,  7745,  7769,  7822,  7858,  7882,  7941,  7972,
+             7997,  8040,  8056,  8080,  8110,  8133,  8178,  8204,  8217,  8243,
+             8255,  8287,
         },
         // 2Sam
-        { 
-             8301,  8302,  8330,  8363,  8403,  8416,  8442,  8466,  8496,  8515, 
-             8529,  8549,  8577,  8609,  8649,  8683,  8721,  8745,  8775,  8809, 
-             8853,  8880,  8903,  8955,  8995, 
+        {
+             8301,  8302,  8330,  8363,  8403,  8416,  8442,  8466,  8496,  8515,
+             8529,  8549,  8577,  8609,  8649,  8683,  8721,  8745,  8775,  8809,
+             8853,  8880,  8903,  8955,  8995,
         },
         // 1Kgs
-        { 
-             9021,  9022,  9076,  9123,  9152,  9187,  9206,  9245,  9297,  9364, 
-             9393,  9423,  9467,  9501,  9536,  9568,  9603,  9638,  9663,  9710, 
-             9732,  9776,  9806, 
+        {
+             9021,  9022,  9076,  9123,  9152,  9187,  9206,  9245,  9297,  9364,
+             9393,  9423,  9467,  9501,  9536,  9568,  9603,  9638,  9663,  9710,
+             9732,  9776,  9806,
         },
         // 2Kgs
-        { 
-             9860,  9861,  9880,  9906,  9934,  9979, 10007, 10041, 10062, 10092, 
-            10130, 10167, 10189, 10211, 10237, 10267, 10306, 10327, 10369, 10407, 
-            10445, 10467, 10494, 10515, 10553, 10574, 
+        {
+             9860,  9861,  9880,  9906,  9934,  9979, 10007, 10041, 10062, 10092,
+            10130, 10167, 10189, 10211, 10237, 10267, 10306, 10327, 10369, 10407,
+            10445, 10467, 10494, 10515, 10553, 10574,
         },
         // 1Chr
-        { 
-            10605, 10606, 10661, 10717, 10742, 10786, 10813, 10895, 10936, 10977, 
-            11022, 11037, 11085, 11126, 11141, 11159, 11189, 11233, 11261, 11279, 
-            11299, 11308, 11339, 11359, 11392, 11424, 11456, 11489, 11524, 11546, 
+        {
+            10605, 10606, 10661, 10717, 10742, 10786, 10813, 10895, 10936, 10977,
+            11022, 11037, 11085, 11126, 11141, 11159, 11189, 11233, 11261, 11279,
+            11299, 11308, 11339, 11359, 11392, 11424, 11456, 11489, 11524, 11546,
         },
         // 2Chr
-        { 
-            11577, 11578, 11596, 11615, 11633, 11656, 11671, 11714, 11737, 11756, 
-            11788, 11808, 11832, 11849, 11872, 11888, 11908, 11923, 11943, 11978, 
-            11990, 12028, 12049, 12062, 12084, 12112, 12141, 12165, 12175, 12203, 
-            12240, 12268, 12290, 12324, 12350, 12384, 12412, 
+        {
+            11577, 11578, 11596, 11615, 11633, 11656, 11671, 11714, 11737, 11756,
+            11788, 11808, 11832, 11849, 11872, 11888, 11908, 11923, 11943, 11978,
+            11990, 12028, 12049, 12062, 12084, 12112, 12141, 12165, 12175, 12203,
+            12240, 12268, 12290, 12324, 12350, 12384, 12412,
         },
         // Ezra
-        { 
-            12436, 12437, 12449, 12520, 12534, 12559, 12577, 12600, 12629, 12666, 
-            12682, 
+        {
+            12436, 12437, 12449, 12520, 12534, 12559, 12577, 12600, 12629, 12666,
+            12682,
         },
         // Neh
-        { 
-            12727, 12728, 12740, 12761, 12794, 12818, 12838, 12858, 12932, 12951, 
-            12990, 13030, 13067, 13115, 
+        {
+            12727, 12728, 12740, 12761, 12794, 12818, 12838, 12858, 12932, 12951,
+            12990, 13030, 13067, 13115,
         },
         // Esth
-        { 
-            13147, 13148, 13171, 13195, 13211, 13229, 13244, 13259, 13270, 13288, 
-            13321, 
+        {
+            13147, 13148, 13171, 13195, 13211, 13229, 13244, 13259, 13270, 13288,
+            13321,
         },
         // Job
-        { 
-            13325, 13326, 13349, 13363, 13390, 13412, 13440, 13471, 13493, 13516, 
-            13552, 13575, 13596, 13622, 13651, 13674, 13710, 13733, 13750, 13772, 
-            13802, 13832, 13867, 13898, 13916, 13942, 13949, 13964, 13988, 14017, 
-            14043, 14075, 14116, 14139, 14173, 14211, 14228, 14262, 14287, 14329, 
-            14360, 14385, 14420, 
+        {
+            13325, 13326, 13349, 13363, 13390, 13412, 13440, 13471, 13493, 13516,
+            13552, 13575, 13596, 13622, 13651, 13674, 13710, 13733, 13750, 13772,
+            13802, 13832, 13867, 13898, 13916, 13942, 13949, 13964, 13988, 14017,
+            14043, 14075, 14116, 14139, 14173, 14211, 14228, 14262, 14287, 14329,
+            14360, 14385, 14420,
         },
         // Ps
-        { 
-            14438, 14439, 14446, 14459, 14468, 14477, 14490, 14501, 14519, 14529, 
-            14550, 14569, 14577, 14586, 14593, 14601, 14607, 14619, 14635, 14686, 
-            14701, 14711, 14725, 14757, 14764, 14775, 14798, 14811, 14826, 14836, 
-            14848, 14861, 14886, 14898, 14921, 14944, 14973, 14986, 15027, 15050, 
-            15064, 15082, 15096, 15108, 15114, 15141, 15159, 15171, 15181, 15196, 
-            15217, 15241, 15261, 15271, 15278, 15286, 15310, 15324, 15336, 15348, 
-            15366, 15379, 15388, 15401, 15413, 15424, 15438, 15459, 15467, 15503, 
-            15540, 15546, 15571, 15592, 15621, 15645, 15656, 15669, 15690, 15763, 
-            15777, 15797, 15814, 15823, 15842, 15855, 15869, 15887, 15895, 15914, 
-            15967, 15985, 16002, 16018, 16024, 16048, 16060, 16074, 16087, 16097, 
-            16107, 16113, 16122, 16151, 16174, 16210, 16256, 16305, 16349, 16363, 
-            16395, 16403, 16414, 16425, 16435, 16444, 16463, 16483, 16486, 16516, 
-            16693, 16701, 16710, 16720, 16725, 16734, 16740, 16747, 16753, 16760, 
-            16769, 16778, 16782, 16801, 16805, 16809, 16831, 16858, 16868, 16877, 
-            16902, 16916, 16927, 16935, 16948, 16964, 16986, 16997, 17018, 17033, 
-            17043, 
+        {
+            14438, 14439, 14446, 14459, 14468, 14477, 14490, 14501, 14519, 14529,
+            14550, 14569, 14577, 14586, 14593, 14601, 14607, 14619, 14635, 14686,
+            14701, 14711, 14725, 14757, 14764, 14775, 14798, 14811, 14826, 14836,
+            14848, 14861, 14886, 14898, 14921, 14944, 14973, 14986, 15027, 15050,
+            15064, 15082, 15096, 15108, 15114, 15141, 15159, 15171, 15181, 15196,
+            15217, 15241, 15261, 15271, 15278, 15286, 15310, 15324, 15336, 15348,
+            15366, 15379, 15388, 15401, 15413, 15424, 15438, 15459, 15467, 15503,
+            15540, 15546, 15571, 15592, 15621, 15645, 15656, 15669, 15690, 15763,
+            15777, 15797, 15814, 15823, 15842, 15855, 15869, 15887, 15895, 15914,
+            15967, 15985, 16002, 16018, 16024, 16048, 16060, 16074, 16087, 16097,
+            16107, 16113, 16122, 16151, 16174, 16210, 16256, 16305, 16349, 16363,
+            16395, 16403, 16414, 16425, 16435, 16444, 16463, 16483, 16486, 16516,
+            16693, 16701, 16710, 16720, 16725, 16734, 16740, 16747, 16753, 16760,
+            16769, 16778, 16782, 16801, 16805, 16809, 16831, 16858, 16868, 16877,
+            16902, 16916, 16927, 16935, 16948, 16964, 16986, 16997, 17018, 17033,
+            17043,
         },
         // Prov
-        { 
-            17050, 17051, 17085, 17108, 17144, 17172, 17196, 17232, 17260, 17297, 
-            17316, 17349, 17381, 17410, 17436, 17472, 17506, 17540, 17569, 17594, 
-            17624, 17655, 17687, 17717, 17753, 17788, 17817, 17846, 17874, 17903, 
-            17931, 17965, 
+        {
+            17050, 17051, 17085, 17108, 17144, 17172, 17196, 17232, 17260, 17297,
+            17316, 17349, 17381, 17410, 17436, 17472, 17506, 17540, 17569, 17594,
+            17624, 17655, 17687, 17717, 17753, 17788, 17817, 17846, 17874, 17903,
+            17931, 17965,
         },
         // Eccl
-        { 
-            17997, 17998, 18017, 18044, 18067, 18084, 18105, 18118, 18148, 18166, 
-            18185, 18206, 18217, 
+        {
+            17997, 17998, 18017, 18044, 18067, 18084, 18105, 18118, 18148, 18166,
+            18185, 18206, 18217,
         },
         // Song
-        { 
-            18232, 18233, 18251, 18269, 18281, 18298, 18315, 18329, 18343, 
+        {
+            18232, 18233, 18251, 18269, 18281, 18298, 18315, 18329, 18343,
         },
         // Isa
-        { 
-            18358, 18359, 18391, 18414, 18441, 18448, 18479, 18493, 18519, 18542, 
-            18564, 18599, 18616, 18623, 18646, 18679, 18689, 18704, 18719, 18727, 
-            18753, 18760, 18778, 18804, 18823, 18847, 18860, 18882, 18896, 18926, 
-            18951, 18985, 18995, 19016, 19041, 19059, 19070, 19093, 19132, 19155, 
-            19164, 19196, 19226, 19252, 19281, 19310, 19336, 19350, 19366, 19389, 
-            19416, 19428, 19452, 19468, 19481, 19499, 19513, 19526, 19548, 19563, 
-            19585, 19608, 19620, 19633, 19653, 19666, 19692, 
+        {
+            18358, 18359, 18391, 18414, 18441, 18448, 18479, 18493, 18519, 18542,
+            18564, 18599, 18616, 18623, 18646, 18679, 18689, 18704, 18719, 18727,
+            18753, 18760, 18778, 18804, 18823, 18847, 18860, 18882, 18896, 18926,
+            18951, 18985, 18995, 19016, 19041, 19059, 19070, 19093, 19132, 19155,
+            19164, 19196, 19226, 19252, 19281, 19310, 19336, 19350, 19366, 19389,
+            19416, 19428, 19452, 19468, 19481, 19499, 19513, 19526, 19548, 19563,
+            19585, 19608, 19620, 19633, 19653, 19666, 19692,
         },
         // Jer
-        { 
-            19717, 19718, 19738, 19776, 19802, 19834, 19866, 19897, 19932, 19955, 
-            19982, 20008, 20032, 20050, 20078, 20101, 20123, 20145, 20173, 20197, 
-            20213, 20232, 20247, 20278, 20319, 20330, 20369, 20394, 20417, 20435, 
-            20468, 20493, 20534, 20579, 20606, 20629, 20649, 20682, 20704, 20733, 
-            20752, 20769, 20788, 20811, 20825, 20856, 20862, 20891, 20899, 20947, 
-            20987, 21034, 21099, 
+        {
+            19717, 19718, 19738, 19776, 19802, 19834, 19866, 19897, 19932, 19955,
+            19982, 20008, 20032, 20050, 20078, 20101, 20123, 20145, 20173, 20197,
+            20213, 20232, 20247, 20278, 20319, 20330, 20369, 20394, 20417, 20435,
+            20468, 20493, 20534, 20579, 20606, 20629, 20649, 20682, 20704, 20733,
+            20752, 20769, 20788, 20811, 20825, 20856, 20862, 20891, 20899, 20947,
+            20987, 21034, 21099,
         },
         // Lam
-        { 
-            21134, 21135, 21158, 21181, 21248, 21271, 
+        {
+            21134, 21135, 21158, 21181, 21248, 21271,
         },
         // Ezek
-        { 
-            21294, 21295, 21324, 21335, 21363, 21381, 21399, 21414, 21442, 21461, 
-            21473, 21496, 21522, 21551, 21575, 21599, 21608, 21672, 21697, 21730, 
-            21745, 21795, 21828, 21860, 21910, 21938, 21956, 21978, 22015, 22042, 
-            22064, 22091, 22110, 22143, 22177, 22209, 22225, 22264, 22293, 22317, 
-            22347, 22397, 22424, 22445, 22473, 22505, 22531, 22556, 22580, 
+        {
+            21294, 21295, 21324, 21335, 21363, 21381, 21399, 21414, 21442, 21461,
+            21473, 21496, 21522, 21551, 21575, 21599, 21608, 21672, 21697, 21730,
+            21745, 21795, 21828, 21860, 21910, 21938, 21956, 21978, 22015, 22042,
+            22064, 22091, 22110, 22143, 22177, 22209, 22225, 22264, 22293, 22317,
+            22347, 22397, 22424, 22445, 22473, 22505, 22531, 22556, 22580,
         },
         // Dan
-        { 
-            22616, 22617, 22639, 22689, 22720, 22758, 22790, 22819, 22848, 22876, 
-            22904, 22926, 22972, 
+        {
+            22616, 22617, 22639, 22689, 22720, 22758, 22790, 22819, 22848, 22876,
+            22904, 22926, 22972,
         },
         // Hos
-        { 
-            22986, 22987, 22999, 23023, 23029, 23049, 23065, 23077, 23094, 23109, 
-            23127, 23143, 23156, 23171, 23188, 
+        {
+            22986, 22987, 22999, 23023, 23029, 23049, 23065, 23077, 23094, 23109,
+            23127, 23143, 23156, 23171, 23188,
         },
         // Joel
-        { 
-            23198, 23199, 23220, 23253, 
+        {
+            23198, 23199, 23220, 23253,
         },
         // Amos
-        { 
-            23275, 23276, 23292, 23309, 23325, 23339, 23367, 23382, 23400, 23415, 
+        {
+            23275, 23276, 23292, 23309, 23325, 23339, 23367, 23382, 23400, 23415,
         },
         // Obad
-        { 
-            23431, 23432, 
+        {
+            23431, 23432,
         },
         // Jonah
-        { 
-            23454, 23455, 23473, 23484, 23495, 
+        {
+            23454, 23455, 23473, 23484, 23495,
         },
         // Mic
-        { 
-            23507, 23508, 23525, 23539, 23552, 23566, 23582, 23599, 
+        {
+            23507, 23508, 23525, 23539, 23552, 23566, 23582, 23599,
         },
         // Nah
-        { 
-            23620, 23621, 23637, 23651, 
+        {
+            23620, 23621, 23637, 23651,
         },
         // Hab
-        { 
-            23671, 23672, 23690, 23711, 
+        {
+            23671, 23672, 23690, 23711,
         },
         // Zeph
-        { 
-            23731, 23732, 23751, 23767, 
+        {
+            23731, 23732, 23751, 23767,
         },
         // Hag
-        { 
-            23788, 23789, 23805, 
+        {
+            23788, 23789, 23805,
         },
         // Zech
-        { 
-            23829, 23830, 23852, 23866, 23877, 23892, 23904, 23920, 23935, 23959, 
-            23977, 23990, 24008, 24023, 24033, 
+        {
+            23829, 23830, 23852, 23866, 23877, 23892, 23904, 23920, 23935, 23959,
+            23977, 23990, 24008, 24023, 24033,
         },
         // Mal
-        { 
-            24055, 24056, 24071, 24089, 24108, 
+        {
+            24055, 24056, 24071, 24089, 24108,
         },
         // NT Testament Introduction
         {
             24115,
         },
         // Matt
-        { 
-            24116, 24117, 24143, 24167, 24185, 24211, 24260, 24295, 24325, 24360, 
-            24399, 24442, 24473, 24524, 24583, 24620, 24660, 24689, 24717, 24753, 
-            24784, 24819, 24866, 24913, 24953, 25005, 25052, 25128, 25195, 
+        {
+            24116, 24117, 24143, 24167, 24185, 24211, 24260, 24295, 24325, 24360,
+            24399, 24442, 24473, 24524, 24583, 24620, 24660, 24689, 24717, 24753,
+            24784, 24819, 24866, 24913, 24953, 25005, 25052, 25128, 25195,
         },
         // Mark
-        { 
-            25216, 25217, 25263, 25292, 25328, 25370, 25414, 25471, 25509, 25548, 
-            25599, 25652, 25686, 25731, 25769, 25842, 25890, 
+        {
+            25216, 25217, 25263, 25292, 25328, 25370, 25414, 25471, 25509, 25548,
+            25599, 25652, 25686, 25731, 25769, 25842, 25890,
         },
         // Luke
-        { 
-            25911, 25912, 25993, 26046, 26085, 26130, 26170, 26220, 26271, 26328, 
-            26391, 26434, 26489, 26549, 26585, 26621, 26654, 26686, 26724, 26768, 
-            26817, 26865, 26904, 26976, 27033, 
+        {
+            25911, 25912, 25993, 26046, 26085, 26130, 26170, 26220, 26271, 26328,
+            26391, 26434, 26489, 26549, 26585, 26621, 26654, 26686, 26724, 26768,
+            26817, 26865, 26904, 26976, 27033,
         },
         // John
-        { 
-            27087, 27088, 27140, 27166, 27203, 27258, 27306, 27378, 27432, 27492, 
-            27534, 27577, 27635, 27686, 27725, 27757, 27785, 27819, 27846, 27887, 
-            27930, 27962, 
+        {
+            27087, 27088, 27140, 27166, 27203, 27258, 27306, 27378, 27432, 27492,
+            27534, 27577, 27635, 27686, 27725, 27757, 27785, 27819, 27846, 27887,
+            27930, 27962,
         },
         // Acts
-        { 
-            27988, 27989, 28016, 28064, 28091, 28129, 28172, 28188, 28249, 28290, 
-            28334, 28383, 28414, 28440, 28493, 28522, 28564, 28605, 28640, 28669, 
-            28711, 28750, 28791, 28822, 28858, 28886, 28914, 28947, 28992, 
+        {
+            27988, 27989, 28016, 28064, 28091, 28129, 28172, 28188, 28249, 28290,
+            28334, 28383, 28414, 28440, 28493, 28522, 28564, 28605, 28640, 28669,
+            28711, 28750, 28791, 28822, 28858, 28886, 28914, 28947, 28992,
         },
         // Rom
-        { 
-            29024, 29025, 29058, 29088, 29120, 29146, 29168, 29192, 29218, 29258, 
-            29292, 29314, 29351, 29373, 29388, 29412, 29446, 
+        {
+            29024, 29025, 29058, 29088, 29120, 29146, 29168, 29192, 29218, 29258,
+            29292, 29314, 29351, 29373, 29388, 29412, 29446,
         },
         // 1Cor
-        { 
-            29474, 29475, 29507, 29524, 29548, 29570, 29584, 29605, 29646, 29660, 
-            29688, 29722, 29757, 29789, 29803, 29844, 29903, 
+        {
+            29474, 29475, 29507, 29524, 29548, 29570, 29584, 29605, 29646, 29660,
+            29688, 29722, 29757, 29789, 29803, 29844, 29903,
         },
         // 2Cor
-        { 
-            29928, 29929, 29954, 29972, 29991, 30010, 30032, 30051, 30068, 30093, 
-            30109, 30128, 30162, 30184, 
+        {
+            29928, 29929, 29954, 29972, 29991, 30010, 30032, 30051, 30068, 30093,
+            30109, 30128, 30162, 30184,
         },
         // Gal
-        { 
-            30199, 30200, 30225, 30247, 30277, 30309, 30336, 
+        {
+            30199, 30200, 30225, 30247, 30277, 30309, 30336,
         },
         // Eph
-        { 
-            30355, 30356, 30380, 30403, 30425, 30458, 30492, 
+        {
+            30355, 30356, 30380, 30403, 30425, 30458, 30492,
         },
         // Phil
-        { 
-            30517, 30518, 30549, 30580, 30602, 
+        {
+            30517, 30518, 30549, 30580, 30602,
         },
         // Col
-        { 
-            30626, 30627, 30657, 30681, 30707, 
+        {
+            30626, 30627, 30657, 30681, 30707,
         },
         // 1Thess
-        { 
-            30726, 30727, 30738, 30759, 30773, 30792, 
+        {
+            30726, 30727, 30738, 30759, 30773, 30792,
         },
         // 2Thess
-        { 
-            30821, 30822, 30835, 30853, 
+        {
+            30821, 30822, 30835, 30853,
         },
         // 1Tim
-        { 
-            30872, 30873, 30894, 30910, 30927, 30944, 30970, 
+        {
+            30872, 30873, 30894, 30910, 30927, 30944, 30970,
         },
         // 2Tim
-        { 
-            30992, 30993, 31012, 31039, 31057, 
+        {
+            30992, 30993, 31012, 31039, 31057,
         },
         // Titus
-        { 
-            31080, 31081, 31098, 31114, 
+        {
+            31080, 31081, 31098, 31114,
         },
         // Phlm
-        { 
-            31130, 31131, 
+        {
+            31130, 31131,
         },
         // Heb
-        { 
-            31157, 31158, 31173, 31192, 31212, 31229, 31244, 31265, 31294, 31308, 
-            31337, 31377, 31418, 31448, 
+        {
+            31157, 31158, 31173, 31192, 31212, 31229, 31244, 31265, 31294, 31308,
+            31337, 31377, 31418, 31448,
         },
         // Jas
-        { 
-            31474, 31475, 31503, 31530, 31549, 31567, 
+        {
+            31474, 31475, 31503, 31530, 31549, 31567,
         },
         // 1Pet
-        { 
-            31588, 31589, 31615, 31641, 31664, 31684, 
+        {
+            31588, 31589, 31615, 31641, 31664, 31684,
         },
         // 2Pet
-        { 
-            31699, 31700, 31722, 31745, 
+        {
+            31699, 31700, 31722, 31745,
         },
         // 1John
-        { 
-            31764, 31765, 31776, 31806, 31831, 31853, 
+        {
+            31764, 31765, 31776, 31806, 31831, 31853,
         },
         // 2John
-        { 
-            31875, 31876, 
+        {
+            31875, 31876,
         },
         // 3John
-        { 
-            31890, 31891, 
+        {
+            31890, 31891,
         },
         // Jude
-        { 
-            31906, 31907, 
+        {
+            31906, 31907,
         },
         // Rev
-        { 
-            31933, 31934, 31955, 31985, 32008, 32020, 32035, 32053, 32071, 32085, 
-            32107, 32119, 32139, 32157, 32176, 32197, 32206, 32228, 32247, 32272, 
-            32294, 32310, 32338, 
+        {
+            31933, 31934, 31955, 31985, 32008, 32020, 32035, 32053, 32071, 32085,
+            32107, 32119, 32139, 32157, 32176, 32197, 32206, 32228, 32247, 32272,
+            32294, 32310, 32338,
         },
-        // Sentinel
-        { 
-            32360, 
-        },
     };
 
-    private static final int NT_ORDINAL_START = 24115;
+    public static ReferenceSystem referenceSystem = new ReferenceSystem(osisName, kjvBooks, kjvLastVerse);
 
     /**
      * A singleton used to do initialization. Could be used to change static
@@ -910,156 +1114,10 @@
     static final BibleInfo instance = new BibleInfo();
 
     /**
-     * This is the code used to create ORDINAL_AT_START_OF_CHAPTER and
-     * ORDINAL_AT_START_OF_BOOK. It is usually commented out because I don't see
-     * any point in making .class files bigger for no reason and this is needed
-     * only very rarely.
-     */ 
-/*
-     public void optimize(PrintStream out) throws NoSuchVerseException {
-        int count = 0;
-        int verseNum = 1;
-        out.println("    private static final int[] ORDINAL_AT_START_OF_BOOK =");
-        out.println("    {");
-        out.print("        ");
-        for (BibleBook b: EnumSet.range(BibleBook.GEN, BibleBook.REV)) {
-            String vstr1 = "     " + verseNum;
-            String vstr2 = vstr1.substring(vstr1.length() - 5);
-            out.print(vstr2 + ", ");
-            verseNum += versesInBook(b);
-
-            if (++count % 10 == 0) {
-                out.println();
-                out.print("        ");
-            }
-        }
-        out.println();
-        out.println("    };");
-
-        count = 0;
-        verseNum = 1;
-        out.println("    private static final int[][] ORDINAL_AT_START_OF_CHAPTER =");
-        out.println("    {");
-        for (BibleBook b: EnumSet.range(BibleBook.GEN, BibleBook.REV)) {
-            out.println("        { ");
-            for (int c = 1; c <= BibleInfo.chaptersInBook(b); c++) {
-                String vstr1 = "     " + verseNum;
-                String vstr2 = vstr1.substring(vstr1.length() - 5);
-                out.println(vstr2 + ", ");
-                verseNum += BibleInfo.versesInChapter(b, c);
-            }
-            out.println("},");
-        }
-        out.println("    };");
-    }
-*/
-    public static void optimize(PrintStream out) {
-        int count = 0;
-        int ordinal = 0;        // 0 is the module introduction
-        ordinal++;              // 1 Old Testament introduction
-        out.println("    private static final int[][] ORDINAL_AT_START_OF_CHAPTER =");
-        out.println("    {");
-        // Output an array for each book in the Old Testament
-        // This array is indexed by book and chapter
-        for (int bookIndex = 0; bookIndex < 39; bookIndex++) {
-            out.print("        // ");
-            out.println(BibleBook.getBooks()[bookIndex].getOSIS());
-            count = 0;
-            out.print("        { ");
-            ordinal++;          // Every book has a slot for a book introduction
-
-            // Pretty print with 10 items per line
-            if (count++ % 10 == 0) {
-                out.println();
-                out.print("            ");
-            }
-            // Output the offset for the book introduction
-            // This is referenced with a chapter number of 0 and verse number 0
-            String vstr1 = "     " + ordinal;
-            String vstr2 = vstr1.substring(vstr1.length() - 5);
-            out.print(vstr2 + ", ");
-            for (int chapterIndex = 0; chapterIndex < VERSES_IN_CHAPTER[bookIndex].length; chapterIndex++) {
-
-                // Pretty print with 10 items per line
-                if (count++ % 10 == 0) {
-                    out.println();
-                    out.print("            ");
-                }
-                ordinal++;      // Every chapter has a slot for a chapter introduction
-                // Output the offset for the chapter introduction
-                // This is referenced with a verse number of 0
-                vstr1 = "     " + ordinal;
-                vstr2 = vstr1.substring(vstr1.length() - 5);
-                out.print(vstr2 + ", ");
-                // Set ordinal to the start of the next chapter or book introduction
-                ordinal += VERSES_IN_CHAPTER[bookIndex][chapterIndex];
-            }
-            out.println();
-            out.println("        },");
-        }
-
-        int ntStartOrdinal = ordinal;
-//        ordinal++;              // This is the New Testament introduction
-        // Likewise, output an array for each book in the New Testament
-        for (int bookIndex = 39; bookIndex < VERSES_IN_CHAPTER.length; bookIndex++) {
-            count = 0;
-            out.print("        // ");
-            out.println(BibleBook.getBooks()[bookIndex].getOSIS());
-            out.print("        { ");
-            ordinal++;          // Every book has a slot for a book introduction
-
-            // Pretty print with 10 items per line
-            if (count++ % 10 == 0) {
-                out.println();
-                out.print("            ");
-            }
-
-            // Output the offset for the book introduction
-            // This is referenced with a chapter number of 0 and verse number 0
-            String vstr1 = "     " + ordinal;
-            String vstr2 = vstr1.substring(vstr1.length() - 5);
-            out.print(vstr2 + ", ");
-            for (int chapterIndex = 0; chapterIndex < VERSES_IN_CHAPTER[bookIndex].length; chapterIndex++) {
-
-                // Pretty print with 10 items per line
-                if (count++ % 10 == 0) {
-                    out.println();
-                    out.print("            ");
-                }
-                ordinal++;      // Every chapter has a slot for a chapter introduction
-                // Output the offset for the chapter introduction
-                // This is referenced with a verse number of 0
-                vstr1 = "     " + ordinal;
-                vstr2 = vstr1.substring(vstr1.length() - 5);
-                out.print(vstr2 + ", ");
-
-                // Set ordinal to the start of the next chapter or book introduction
-                ordinal += VERSES_IN_CHAPTER[bookIndex][chapterIndex];
-            }
-            out.println();
-            out.println("        },");
-        }
-
-        // Output a sentinel value:
-        // It is a book of one chapter starting with what would be the ordinal of the next chapter's introduction.
-        ordinal++;
-        String vstr1 = "     " + ordinal;
-        String vstr2 = vstr1.substring(vstr1.length() - 5);
-        out.println("        // Sentinel");
-        out.println("        { ");
-        out.println("            " + vstr2 + ", ");
-        out.println("        },");
-        out.println("    };");
-        out.println();
-        out.println("    private static final int NT_ORDINAL_START = " + ntStartOrdinal + ";");
-        out.println("    private static final int NT_BOOK_START = 39;");
-    }
-  
-    /**
      * Get the BookName.
      * This is merely a convenience function that validates that book is not null,
      * throwing NoSuchVerseException if it is.
-     * 
+     *
      * @param book
      *            The book of the Bible
      * @return The requested BookName
@@ -1078,7 +1136,7 @@
 
     /**
      * Get number of a book from its name.
-     * 
+     *
      * @param find
      *            The string to identify
      * @return The BibleBook, On error null
@@ -1092,7 +1150,7 @@
     /**
      * Is the given string a valid book name. If this method returns true then
      * getBook() will return a BibleBook and not throw an exception.
-     * 
+     *
      * @param find
      *            The string to identify
      * @return true when the book name is recognized
@@ -1105,7 +1163,7 @@
 
     /**
      * Count the chapters in the Bible.
-     * 
+     *
      * @return 1189 always - the number of chapters in the Bible
      * @deprecated do not use
      */
@@ -1117,7 +1175,7 @@
     /**
      * The maximum number of verses in the Bible, including module, testament, book and chapter introductions.
      * Note: it used to exclude introductions.
-     * 
+     *
      * @return the number of addressable verses in this versification.
      * @deprecated use {@link #BibleInfo.maximumOrdinal()}
      */
@@ -1131,7 +1189,7 @@
      * setBookCase() and isFullBookName())
      * This is merely a convenience function that validates that book is not null,
      * throwing NoSuchVerseException if it is.
-     * 
+     *
      * @param book
      *            The book of the Bible
      * @return The full name of the book
@@ -1153,7 +1211,7 @@
      * (see setBookCase())
      * This is merely a convenience function that validates that book is not null,
      * throwing NoSuchVerseException if it is.
-     * 
+     *
      * @param book
      *            The book of the Bible
      * @return The full name of the book
@@ -1175,7 +1233,7 @@
      * (see setBookCase())
      * This is merely a convenience function that validates that book is not null,
      * throwing NoSuchVerseException if it is.
-     * 
+     *
      * @param book
      *            The book of the Bible
      * @return The short name of the book
@@ -1196,7 +1254,7 @@
      * Get the OSIS name for a book.
      * This is merely a convenience function that validates that book is not null,
      * throwing NoSuchVerseException if it is.
-     * 
+     *
      * @param book
      *            The book of the Bible
      * @return the OSIS defined short name for a book
@@ -1215,7 +1273,7 @@
 
     /**
      * How many verses between verse1 and verse2 (inclusive).
-     * 
+     *
      * @param verse1
      *            The earlier verse.
      * @param verse2
@@ -1232,7 +1290,7 @@
 
     /**
      * This is only used by config.
-     * 
+     *
      * @param bookCase
      *            The new case to use for reporting book names
      * @exception IllegalArgumentException
@@ -1247,7 +1305,7 @@
 
     /**
      * This is only used by config
-     * 
+     *
      * @return The current case setting
      * @see #setCase(CaseType)
      * @deprecated use {@link #BookName.getCase()}
@@ -1263,7 +1321,7 @@
      * app using a different format. I expect this to be a good assumption, and
      * it saves passing a Book class around everywhere. CaseType.MIXED is not
      * allowed
-     * 
+     *
      * @param newBookCase
      *            The new case to use for reporting book names
      * @exception IllegalArgumentException
@@ -1278,7 +1336,7 @@
 
     /**
      * This is only used by config
-     * 
+     *
      * @return Whether the name is long or short. Default is Full (true).
      * @see #setFullBookName(boolean)
      * @deprecated use {@link #BookName.isFullBookName()}
@@ -1290,7 +1348,7 @@
 
     /**
      * Set whether the name should be full or abbreviated, long or short.
-     * 
+     *
      * @param fullName
      *            The new case to use for reporting book names
      * @see #isFullBookName()
@@ -1303,7 +1361,7 @@
 
     /**
      * How do we report the names of the books?.
-     * 
+     *
      * @return The current case setting
      * @see #setCase(int)
      * @deprecated use {@link #BookName.getDefaultCase()}
@@ -1313,6 +1371,4 @@
         return BookName.getDefaultCase();
     }
 
-
-    
 }

Modified: trunk/jsword/src/main/java/org/crosswire/jsword/versification/BibleNames.java
===================================================================
--- trunk/jsword/src/main/java/org/crosswire/jsword/versification/BibleNames.java	2012-01-14 14:06:50 UTC (rev 2209)
+++ trunk/jsword/src/main/java/org/crosswire/jsword/versification/BibleNames.java	2012-01-14 14:10:44 UTC (rev 2210)
@@ -143,9 +143,9 @@
      * upper and lower versions of them.
      */
     private void initialize() {
-        int booksInBible = BibleInfo.booksInBible();
+        int booksInBible = BibleBook.values().length;
 
-        books = new BookName[BibleBook.values().length];
+        books = new BookName[booksInBible];
 
         // Create the book name maps
         fullBooksMap = new HashMap<String, BookName>(booksInBible);

Modified: trunk/jsword/src/main/java/org/crosswire/jsword/versification/ReferenceSystem.java
===================================================================
--- trunk/jsword/src/main/java/org/crosswire/jsword/versification/ReferenceSystem.java	2012-01-14 14:06:50 UTC (rev 2209)
+++ trunk/jsword/src/main/java/org/crosswire/jsword/versification/ReferenceSystem.java	2012-01-14 14:10:44 UTC (rev 2210)
@@ -21,6 +21,8 @@
  */
 package org.crosswire.jsword.versification;
 
+import java.io.PrintStream;
+
 import org.crosswire.jsword.JSMsg;
 import org.crosswire.jsword.JSOtherMsg;
 import org.crosswire.jsword.passage.NoSuchVerseException;
@@ -39,10 +41,59 @@
 public class ReferenceSystem {
     /**
      * Construct a ReferenceSystem.
+     * 
      * @param osisName
+     *            The name of this reference system
+     * @param books
+     *            An ordered list of books in this reference system. The list
+     *            should always start with INTRO_BIBLE and INTRO_OT. The first
+     *            New Testament book should be preceded by INTRO_NT.
+     * @param lastVerse
+     *            For each book in books, this has an array with one entry for
+     *            each chapter including chapter 0 whose value is the highest
+     *            numbered verse in that chapter.
      */
-    public ReferenceSystem(String osisName) {
+    public ReferenceSystem(String osisName, BibleBook[] books, int[][] lastVerse) {
         this.osisName = osisName;
+        this.bookList = new BibleBookList(books);
+
+        int ordinal = 0;
+        int bookCount = lastVerse.length;
+
+        // Create an independent copy of lastVerse.
+        this.lastVerse = lastVerse.clone();
+        for (int bookIndex = 0; bookIndex < bookCount; bookIndex++) {
+            this.lastVerse[bookIndex] = lastVerse[bookIndex].clone();
+        }
+
+        // Initialize chapterStarts to be a parallel array to lastVerse,
+        // but with chapter starts
+        this.chapterStarts = new int[bookCount][];
+        for (int bookIndex = 0; bookIndex < bookCount; bookIndex++) {
+
+            // Remember where the OT ends
+            if (bookList.getBook(bookIndex) == BibleBook.INTRO_NT) {
+                this.otMaxOrdinal = ordinal - 1;
+            }
+
+            // Save off the chapter starts
+            int[] src = this.lastVerse[bookIndex];
+            int numChapters = src.length;
+            int[] dest = new int[numChapters];
+            this.chapterStarts[bookIndex] = dest;
+            for (int chapterIndex = 0; chapterIndex < numChapters; chapterIndex++) {
+                // Save off the chapter start
+                dest[chapterIndex] = ordinal;
+
+                // Set ordinal to the start of the next chapter or book introduction.
+                // The number of verses in each chapter, when including verse 0,
+                // is one more that the largest numbered verse in the chapter.
+                ordinal += src[chapterIndex] + 1;
+            }
+        }
+
+        // Remember where the NT ends
+        this.ntMaxOrdinal = ordinal - 1;
     }
 
     /**
@@ -53,35 +104,13 @@
         return osisName;
     }
 
-    /**
-     * Given a BibleBook, get the previous BibleBook in this ReferenceSystem. If it is the first book, return null.
-     * @param book A BibleBook in the ReferenceSystem
-     * @return the previous BibleBook or null.
-     */
-    public BibleBook getPreviousBook(BibleBook book) {
-        try {
-            return books[book.ordinal() - 1];
-        } catch (ArrayIndexOutOfBoundsException e) {
-            return null;
-        }
+    public BibleBookList getBooks() {
+        return bookList;
     }
 
     /**
-     * Given a BibleBook, get the next BibleBook in this ReferenceSystem. If it is the last book, return null.
-     * @param book A BibleBook in the ReferenceSystem
-     * @return the previous BibleBook or null.
-     */
-    public BibleBook getNextBook(BibleBook book) {
-        try {
-            return books[book.ordinal() + 1];
-        } catch (ArrayIndexOutOfBoundsException e) {
-            return null;
-        }
-    }
-
-    /**
      * Get the last valid chapter number for a book.
-     * 
+     *
      * @param book
      *            The book part of the reference.
      * @return The last valid chapter number for a book.
@@ -91,7 +120,7 @@
         // The exception is actually thrown, then it is a lot slower
         // I'd like to think that the norm is to get it right
         try {
-            return lastVerse[book.ordinal()].length - 1;
+            return lastVerse[bookList.getOrdinal(book)].length - 1;
         } catch (NullPointerException ex) {
             return 0;
         } catch (ArrayIndexOutOfBoundsException ex) {
@@ -101,7 +130,7 @@
 
     /**
      * Get the last valid verse number for a chapter.
-     * 
+     *
      * @param book
      *            The book part of the reference.
      * @param chapter
@@ -113,7 +142,7 @@
         // The exception is actually thrown, then it is a lot slower
         // I'd like to think that the norm is to get it right
         try {
-            return lastVerse[book.ordinal()][chapter];
+            return lastVerse[bookList.getOrdinal(book)][chapter];
         } catch (NullPointerException ex) {
             return 0;
         } catch (ArrayIndexOutOfBoundsException ex) {
@@ -123,7 +152,7 @@
 
     /**
      * Create a new Verse being the last verse in the current book
-     * 
+     *
      * @return The last verse in this book
      */
     public Verse getLastVerseInBook(Verse verse) {
@@ -136,7 +165,7 @@
 
     /**
      * Create a new Verse being the last verse in the current book
-     * 
+     *
      * @return The last verse in this book
      */
     public Verse getLastVerseInChapter(Verse verse) {
@@ -149,7 +178,7 @@
 
     /**
      * Create a new Verse being the first verse in the current book
-     * 
+     *
      * @return The first verse in this book
      */
     public Verse getFirstVerseInBook(Verse verse) {
@@ -158,7 +187,7 @@
 
     /**
      * Create a new Verse being the first verse in the current book
-     * 
+     *
      * @return The first verse in this book
      */
     public Verse getFirstVerseInChapter(Verse verse) {
@@ -167,7 +196,7 @@
 
     /**
      * Is this verse the first in a chapter
-     * 
+     *
      * @return true or false ...
      */
     public boolean isStartOfChapter(Verse verse) {
@@ -177,7 +206,7 @@
 
     /**
      * Is this verse the first in a chapter
-     * 
+     *
      * @return true or false ...
      */
     public boolean isEndOfChapter(Verse verse) {
@@ -187,7 +216,7 @@
 
     /**
      * Is this verse the first in a chapter
-     * 
+     *
      * @return true or false ...
      */
     public boolean isStartOfBook(Verse verse) {
@@ -198,7 +227,7 @@
 
     /**
      * Is this verse the last in the book
-     * 
+     *
      * @return true or false ...
      */
     public boolean isEndOfBook(Verse verse) {
@@ -210,7 +239,7 @@
 
     /**
      * Is this verse in the same chapter as that one
-     * 
+     *
      * @param that
      *            The verse to compare to
      * @return true or false ...
@@ -221,7 +250,7 @@
 
     /**
      * Is this verse in the same book as that one
-     * 
+     *
      * @param that
      *            The verse to compare to
      * @return true or false ...
@@ -232,7 +261,7 @@
 
     /**
      * Is this verse adjacent to another verse
-     * 
+     *
      * @param first
      *            The first verse in the comparison
      * @param second
@@ -247,7 +276,7 @@
      * How many verses are there in between the 2 Verses. The answer is -ve if
      * start is bigger than end. The answer is inclusive of start and exclusive
      * of end, so that <code>distance(gen11, gen12) == 1</code>
-     * 
+     *
      * @param start
      *            The first Verse in the range
      * @param end The last Verse in the range
@@ -259,7 +288,7 @@
 
     /**
      * Get the verse n down from here this Verse.
-     * 
+     *
      * @param n
      *            The number to count down by
      * @return The new Verse
@@ -270,7 +299,7 @@
 
     /**
      * Get the verse that is a few verses on from the one we've got.
-     * 
+     *
      * @param n
      *            the number of verses later than the one we're one
      * @return The new verse
@@ -281,13 +310,12 @@
 
     /**
      * The maximum number of verses in the Bible, including module, testament, book and chapter introductions.
-     * 
+     *
      * @return the number of addressable verses in this versification.
      */
     public int maximumOrdinal() {
-        // The sentinel value in chapterStarts points to what would be the book introduction
-        // of the book following the last book in the NT, typically REV.
-        return chapterStarts[chapterStarts.length - 1][0] - 1;
+        // This is the same as the last ordinal in the Reference System.
+        return ntMaxOrdinal;
     }
 
     /**
@@ -311,13 +339,13 @@
      * <li>n + 4 - Matt 1:1</li>
      * <li>...</li>
      * </ul>
-     * 
+     *
      * @param verse
      *            The verse to convert
      * @return The ordinal number of verses
      */
     public int getOrdinal(Verse verse) {
-        return chapterStarts[verse.getBook().ordinal()][verse.getChapter()] + verse.getVerse();
+        return chapterStarts[bookList.getOrdinal(verse.getBook())][verse.getChapter()] + verse.getVerse();
     }
 
     /**
@@ -341,24 +369,56 @@
      * <li>3 - Matt 1:1</li>
      * <li>...</li>
      * </ul>
-     * 
+     *
      * @param verse
      *            The verse to convert
      * @return The ordinal number of verses
      */
-    public int getTestamentOrdinal(Verse verse) {
-        int ordinal = chapterStarts[verse.getBook().ordinal()][verse.getChapter()] + verse.getVerse();
-        if (ordinal >= ntStart) {
-            return ordinal - ntStart + 1;
+    public int getTestamentOrdinal(int ordinal) {
+        int nt_ordinal = otMaxOrdinal + 1;
+        if (ordinal >= nt_ordinal) {
+            return ordinal - nt_ordinal + 1;
         }
         return ordinal;
     }
 
     /**
+     * Get the testament of a given verse
+     */
+    public Testament getTestament(int ordinal) {
+        if (ordinal > otMaxOrdinal) {
+            // This is an NT verse
+            return Testament.NEW;
+        }
+        // This is an OT verse
+        return Testament.OLD;
+    }
+
+    /**
+     * Give the count of verses in the testament or the whole Bible.
+     *
+     * @param testament The testament to count. If null, then all testaments.
+     * @return the number of verses in the testament
+     */
+    public int getCount(Testament testament) {
+        int total = ntMaxOrdinal + 1;
+        if (testament == null) {
+            return total;
+        }
+
+        int otCount = otMaxOrdinal + 1;
+        if (testament == Testament.OLD) {
+            return otCount;
+        }
+
+        return total - otCount;
+    }
+
+    /**
      * Where does this verse come in the Bible. This will unwind the value returned by getOrdinal(Verse).
      * If the ordinal value is less than 0 or greater than the last verse in this ReferenceSystem,
      * then constrain it to the first or last verse in this ReferenceSystem.
-     * 
+     *
      * @param ordinal
      *            The ordinal number of the verse
      * @return A Verse
@@ -372,8 +432,8 @@
 
         if (ord < 0) {
             ord = 0;
-        } else if (ord > maximumOrdinal()) {
-            ord = maximumOrdinal();
+        } else if (ord > ntMaxOrdinal) {
+            ord = ntMaxOrdinal;
         }
 
         // Handle three special cases
@@ -388,12 +448,10 @@
         }
 
         // NT introduction
-        if (ord == ntStart) {
+        if (ord == otMaxOrdinal + 1) {
             return new Verse(BibleBook.INTRO_NT, 0, 0);
         }
 
-        // The chapterStarts has a sentinel value at the end of the array
-        // Therefore, subtract  1
         int lastBook = chapterStarts.length - 1;
         for (int b = lastBook; b >= 0; b--) {
             // A book has a slot for a heading followed by a slot for a chapter heading.
@@ -404,7 +462,7 @@
             }
         }
 
-        book = BibleBook.getBooks()[bookIndex];
+        book = bookList.getBook(bookIndex);
         int cib = getLastChapter(book);
         for (int c = cib; c >= 0; c--) {
             if (ord >= chapterStarts[bookIndex][c]) {
@@ -416,7 +474,7 @@
         if (chapterIndex > 0) {
             verse = ord - chapterStarts[bookIndex][chapterIndex];
         }
-        
+
         return new Verse(book, chapterIndex, verse, true);
     }
 
@@ -425,7 +483,7 @@
      * makes me wonder if I18 is done well/worth doing. All this code does is
      * check if the numbers are valid, but the exception handling code is huge
      * :(
-     * 
+     *
      * @param book
      *            The book part of the reference.
      * @param chapter
@@ -493,7 +551,7 @@
      * expecting us to type "Psa 999:1" seems like we're getting silly.
      * <p>
      * However despite this maybe we should provide the functionality anyway.
-     * 
+     *
      * @param book the book to obtain
      * @param chapter the supposed chapter
      * @param verse the supposed verse
@@ -503,7 +561,7 @@
         BibleBook patchedBook = book;
         int patchedChapter = chapter;
         int patchedVerse = verse;
-        
+
         // If the book is null, then patch to GENESIS
         if (patchedBook == null) {
             patchedBook = BibleBook.GEN;
@@ -518,7 +576,7 @@
 
         while (patchedChapter > getLastChapter(patchedBook)) {
             patchedChapter -= getLastChapter(patchedBook);
-            patchedBook = getNextBook(patchedBook);
+            patchedBook = bookList.getNextBook(patchedBook);
 
             if (patchedBook == null) {
                 patchedBook = BibleBook.REV;
@@ -534,7 +592,7 @@
 
             if (patchedChapter > getLastChapter(patchedBook)) {
                 patchedChapter -= getLastChapter(patchedBook);
-                patchedBook = getNextBook(patchedBook);
+                patchedBook = bookList.getNextBook(patchedBook);
 
                 if (patchedBook == null) {
                     patchedBook = BibleBook.REV;
@@ -551,766 +609,125 @@
     /** The OSIS name of the reference system. */
     private String osisName;
 
-    /** The ordered list of BibleBooks */
-    private BibleBook[] books;
 
-    private int ntStart = 24115;
+    private BibleBookList bookList;
 
+    /** The last ordinal number of the Old Testament */
+    private int otMaxOrdinal;
+
+    /** The last ordinal number of the New Testament and the maximum ordinal number of this Reference System */
+    private int ntMaxOrdinal;
+
     /** Constant for the max verse number in each chapter */
-    private int[][] lastVerse =
-    {
-        // Bible Introduction
-        {
-                0,
-        },
-        // Old Testament Introduction
-        {
-                0,
-        },
-        // Gen
-        {
-                0,    31,    25,    24,    26,    32,    22,    24,    22,    29,
-               32,    32,    20,    18,    24,    21,    16,    27,    33,    38,
-               18,    34,    24,    20,    67,    34,    35,    46,    22,    35,
-               43,    55,    32,    20,    31,    29,    43,    36,    30,    23,
-               23,    57,    38,    34,    34,    28,    34,    31,    22,    33,
-               26,
-        },
-        // Exod
-        {
-                0,    22,    25,    22,    31,    23,    30,    25,    32,    35,
-               29,    10,    51,    22,    31,    27,    36,    16,    27,    25,
-               26,    36,    31,    33,    18,    40,    37,    21,    43,    46,
-               38,    18,    35,    23,    35,    35,    38,    29,    31,    43,
-               38,
-        },
-        // Lev
-        {
-                0,    17,    16,    17,    35,    19,    30,    38,    36,    24,
-               20,    47,     8,    59,    57,    33,    34,    16,    30,    37,
-               27,    24,    33,    44,    23,    55,    46,    34,
-        },
-        // Num
-        {
-                0,    54,    34,    51,    49,    31,    27,    89,    26,    23,
-               36,    35,    16,    33,    45,    41,    50,    13,    32,    22,
-               29,    35,    41,    30,    25,    18,    65,    23,    31,    40,
-               16,    54,    42,    56,    29,    34,    13,
-        },
-        // Deut
-        {
-                0,    46,    37,    29,    49,    33,    25,    26,    20,    29,
-               22,    32,    32,    18,    29,    23,    22,    20,    22,    21,
-               20,    23,    30,    25,    22,    19,    19,    26,    68,    29,
-               20,    30,    52,    29,    12,
-        },
-        // Josh
-        {
-                0,    18,    24,    17,    24,    15,    27,    26,    35,    27,
-               43,    23,    24,    33,    15,    63,    10,    18,    28,    51,
-                9,    45,    34,    16,    33,
-        },
-        // Judg
-        {
-                0,    36,    23,    31,    24,    31,    40,    25,    35,    57,
-               18,    40,    15,    25,    20,    20,    31,    13,    31,    30,
-               48,    25,
-        },
-        // Ruth
-        {
-                0,    22,    23,    18,    22,
-        },
-        // 1Sam
-        {
-                0,    28,    36,    21,    22,    12,    21,    17,    22,    27,
-               27,    15,    25,    23,    52,    35,    23,    58,    30,    24,
-               42,    15,    23,    29,    22,    44,    25,    12,    25,    11,
-               31,    13,
-        },
-        // 2Sam
-        {
-                0,    27,    32,    39,    12,    25,    23,    29,    18,    13,
-               19,    27,    31,    39,    33,    37,    23,    29,    33,    43,
-               26,    22,    51,    39,    25,
-        },
-        // 1Kgs
-        {
-                0,    53,    46,    28,    34,    18,    38,    51,    66,    28,
-               29,    43,    33,    34,    31,    34,    34,    24,    46,    21,
-               43,    29,    53,
-        },
-        // 2Kgs
-        {
-                0,    18,    25,    27,    44,    27,    33,    20,    29,    37,
-               36,    21,    21,    25,    29,    38,    20,    41,    37,    37,
-               21,    26,    20,    37,    20,    30,
-        },
-        // 1Chr
-        {
-                0,    54,    55,    24,    43,    26,    81,    40,    40,    44,
-               14,    47,    40,    14,    17,    29,    43,    27,    17,    19,
-                8,    30,    19,    32,    31,    31,    32,    34,    21,    30,
-        },
-        // 2Chr
-        {
-                0,    17,    18,    17,    22,    14,    42,    22,    18,    31,
-               19,    23,    16,    22,    15,    19,    14,    19,    34,    11,
-               37,    20,    12,    21,    27,    28,    23,     9,    27,    36,
-               27,    21,    33,    25,    33,    27,    23,
-        },
-        // Ezra
-        {
-                0,    11,    70,    13,    24,    17,    22,    28,    36,    15,
-               44,
-        },
-        // Neh
-        {
-                0,    11,    20,    32,    23,    19,    19,    73,    18,    38,
-               39,    36,    47,    31,
-        },
-        // Esth
-        {
-                0,    22,    23,    15,    17,    14,    14,    10,    17,    32,
-                3,
-        },
-        // Job
-        {
-                0,    22,    13,    26,    21,    27,    30,    21,    22,    35,
-               22,    20,    25,    28,    22,    35,    22,    16,    21,    29,
-               29,    34,    30,    17,    25,     6,    14,    23,    28,    25,
-               31,    40,    22,    33,    37,    16,    33,    24,    41,    30,
-               24,    34,    17,
-        },
-        // Ps
-        {
-                0,     6,    12,     8,     8,    12,    10,    17,     9,    20,
-               18,     7,     8,     6,     7,     5,    11,    15,    50,    14,
-                9,    13,    31,     6,    10,    22,    12,    14,     9,    11,
-               12,    24,    11,    22,    22,    28,    12,    40,    22,    13,
-               17,    13,    11,     5,    26,    17,    11,     9,    14,    20,
-               23,    19,     9,     6,     7,    23,    13,    11,    11,    17,
-               12,     8,    12,    11,    10,    13,    20,     7,    35,    36,
-                5,    24,    20,    28,    23,    10,    12,    20,    72,    13,
-               19,    16,     8,    18,    12,    13,    17,     7,    18,    52,
-               17,    16,    15,     5,    23,    11,    13,    12,     9,     9,
-                5,     8,    28,    22,    35,    45,    48,    43,    13,    31,
-                7,    10,    10,     9,     8,    18,    19,     2,    29,   176,
-                7,     8,     9,     4,     8,     5,     6,     5,     6,     8,
-                8,     3,    18,     3,     3,    21,    26,     9,     8,    24,
-               13,    10,     7,    12,    15,    21,    10,    20,    14,     9,
-                6,
-        },
-        // Prov
-        {
-                0,    33,    22,    35,    27,    23,    35,    27,    36,    18,
-               32,    31,    28,    25,    35,    33,    33,    28,    24,    29,
-               30,    31,    29,    35,    34,    28,    28,    27,    28,    27,
-               33,    31,
-        },
-        // Eccl
-        {
-                0,    18,    26,    22,    16,    20,    12,    29,    17,    18,
-               20,    10,    14,
-        },
-        // Song
-        {
-                0,    17,    17,    11,    16,    16,    13,    13,    14,
-        },
-        // Isa
-        {
-                0,    31,    22,    26,     6,    30,    13,    25,    22,    21,
-               34,    16,     6,    22,    32,     9,    14,    14,     7,    25,
-                6,    17,    25,    18,    23,    12,    21,    13,    29,    24,
-               33,     9,    20,    24,    17,    10,    22,    38,    22,     8,
-               31,    29,    25,    28,    28,    25,    13,    15,    22,    26,
-               11,    23,    15,    12,    17,    13,    12,    21,    14,    21,
-                      22,    11,    12,    19,    12,    25,    24,
-        },
-        // Jer
-        {
-                0,    19,    37,    25,    31,    31,    30,    34,    22,    26,
-               25,    23,    17,    27,    22,    21,    21,    27,    23,    15,
-               18,    14,    30,    40,    10,    38,    24,    22,    17,    32,
-               24,    40,    44,    26,    22,    19,    32,    21,    28,    18,
-               16,    18,    22,    13,    30,     5,    28,     7,    47,    39,
-               46,    64,    34,
-        },
-        // Lam
-        {
-            0,    22,    22,    66,    22,    22,
-        },
-        // Ezek
-        {
-                0,    28,    10,    27,    17,    17,    14,    27,    18,    11,
-               22,    25,    28,    23,    23,     8,    63,    24,    32,    14,
-               49,    32,    31,    49,    27,    17,    21,    36,    26,    21,
-               26,    18,    32,    33,    31,    15,    38,    28,    23,    29,
-               49,    26,    20,    27,    31,    25,    24,    23,    35,
-        },
-        // Dan
-        {
-                0,    21,    49,    30,    37,    31,    28,    28,    27,    27,
-               21,    45,    13,
-        },
-        // Hos
-        {
-                0,    11,    23,     5,    19,    15,    11,    16,    14,    17,
-               15,    12,    14,    16,     9,
-        },
-        // Joel
-        {
-                0,    20,    32,    21,
-        },
-        // Amos
-        {
-                0,    15,    16,    15,    13,    27,    14,    17,    14,    15,
-        },
-        // Obad
-        {
-                0,    21,
-        },
-        // Jonah
-        {
-                0,    17,    10,    10,    11,
-        },
-        // Mic
-        {
-                0,    16,    13,    12,    13,    15,    16,    20,
-        },
-        // Nah
-        {
-                0,    15,    13,    19,
-        },
-        // Hab
-        {
-                0,    17,    20,    19,
-        },
-        // Zeph
-        {
-                0,    18,    15,    20,
-        },
-        // Hag
-        {
-                0,    15,    23,
-        },
-        // Zech
-        {
-                0,    21,    13,    10,    14,    11,    15,    14,    23,    17,
-               12,    17,    14,     9,    21,
-        },
-        // Mal
-        {
-                0,    14,    17,    18,     6,
-        },
-        // New Testament Introduction
-        {
-                0,
-        },
-        // Matt
-        {
-                0,    25,    23,    17,    25,    48,    34,    29,    34,    38,
-               42,    30,    50,    58,    36,    39,    28,    27,    35,    30,
-               34,    46,    46,    39,    51,    46,    75,    66,    20,
-        },
-        // Mark
-        {
-                0,    45,    28,    35,    41,    43,    56,    37,    38,    50,
-               52,    33,    44,    37,    72,    47,    20,
-        },
-        // Luke
-        {
-                0,    80,    52,    38,    44,    39,    49,    50,    56,    62,
-               42,    54,    59,    35,    35,    32,    31,    37,    43,    48,
-               47,    38,    71,    56,    53,
-        },
-        // John
-        {
-                0,    51,    25,    36,    54,    47,    71,    53,    59,    41,
-               42,    57,    50,    38,    31,    27,    33,    26,    40,    42,
-               31,    25,
-        },
-        // Acts
-        {
-                0,    26,    47,    26,    37,    42,    15,    60,    40,    43,
-               48,    30,    25,    52,    28,    41,    40,    34,    28,    41,
-               38,    40,    30,    35,    27,    27,    32,    44,    31,
-        },
-        // Rom
-        {
-                0,    32,    29,    31,    25,    21,    23,    25,    39,    33,
-               21,    36,    21,    14,    23,    33,    27,
-        },
-        // 1Cor
-        {
-                0,    31,    16,    23,    21,    13,    20,    40,    13,    27,
-               33,    34,    31,    13,    40,    58,    24,
-        },
-        // 2Cor
-        {
-                0,    24,    17,    18,    18,    21,    18,    16,    24,    15,
-               18,    33,    21,    14,
-        },
-        // Gal
-        {
-                0,    24,    21,    29,    31,    26,    18,
-        },
-        // Eph
-        {
-                0,    23,    22,    21,    32,    33,    24,
-        },
-        // Phil
-        {
-                0,    30,    30,    21,    23,
-        },
-        // Col
-        {
-                0,    29,    23,    25,    18,
-        },
-        // 1Thess
-        {
-                0,    10,    20,    13,    18,    28,
-        },
-        // 2Thess
-        {
-                0,    12,    17,    18,
-        },
-        // 1Tim
-        {
-                0,    20,    15,    16,    16,    25,    21,
-        },
-        // 2Tim
-        {
-                0,    18,    26,    17,    22,
-        },
-        // Titus
-        {
-                0,    16,    15,    15,
-        },
-        // Phlm
-        {
-                0,    25,
-        },
-        // Heb
-        {
-                0,    14,    18,    19,    16,    14,    20,    28,    13,    28,
-               39,    40,    29,    25,
-        },
-        // Jas
-        {
-                0,    27,    26,    18,    17,    20,
-        },
-        // 1Pet
-        {
-                0,    25,    25,    22,    19,    14,
-        },
-        // 2Pet
-        {
-                0,    21,    22,    18,
-        },
-        // 1John
-        {
-                0,    10,    29,    24,    21,    21,
-        },
-        // 2John
-        {
-                0,    13,
-        },
-        // 3John
-        {
-                0,    14,
-        },
-        // Jude
-        {
-                0,    25,
-        },
-        // Rev
-        {
-                0,    20,    29,    22,    11,    14,    17,    17,    13,    21,
-               11,    19,    17,    18,    20,     8,    21,    18,    24,    21,
-               15,    27,    21,
-        },
-    };
+    private int[][] lastVerse;
 
     /**
      * Constant for the ordinal number of the first verse in each chapter.
      */
-    // Note the sentinel at the end of the array is one greater
-    // than the last ordinal in the last book
-    private int[][] chapterStarts =
-    {
-        // Bible Introduction
-        {
-                0,
-        },
-        // Old Testament Introduction
-        {
-                1,
-        },
-        // Gen
-        { 
-                2,     3,    35,    61,    86,   113,   146,   169,   194,   217, 
-              247,   280,   313,   334,   353,   378,   400,   417,   445,   479, 
-              518,   537,   572,   597,   618,   686,   721,   757,   804,   827, 
-              863,   907,   963,   996,  1017,  1049,  1079,  1123,  1160,  1191, 
-             1215,  1239,  1297,  1336,  1371,  1406,  1435,  1470,  1502,  1525, 
-             1559, 
-        },
-        // Exod
-        { 
-             1586,  1587,  1610,  1636,  1659,  1691,  1715,  1746,  1772,  1805, 
-             1841,  1871,  1882,  1934,  1957,  1989,  2017,  2054,  2071,  2099, 
-             2125,  2152,  2189,  2221,  2255,  2274,  2315,  2353,  2375,  2419, 
-             2466,  2505,  2524,  2560,  2584,  2620,  2656,  2695,  2725,  2757, 
-             2801, 
-        },
-        // Lev
-        { 
-             2840,  2841,  2859,  2876,  2894,  2930,  2950,  2981,  3020,  3057, 
-             3082,  3103,  3151,  3160,  3220,  3278,  3312,  3347,  3364,  3395, 
-             3433,  3461,  3486,  3520,  3565,  3589,  3645,  3692, 
-        },
-        // Num
-        { 
-             3727,  3728,  3783,  3818,  3870,  3920,  3952,  3980,  4070,  4097, 
-             4121,  4158,  4194,  4211,  4245,  4291,  4333,  4384,  4398,  4431, 
-             4454,  4484,  4520,  4562,  4593,  4619,  4638,  4704,  4728,  4760, 
-             4801,  4818,  4873,  4916,  4973,  5003,  5038, 
-        },
-        // Deut
-        { 
-             5052,  5053,  5100,  5138,  5168,  5218,  5252,  5278,  5305,  5326, 
-             5356,  5379,  5412,  5445,  5464,  5494,  5518,  5541,  5562,  5585, 
-             5607,  5628,  5652,  5683,  5709,  5732,  5752,  5772,  5799,  5868, 
-             5898,  5919,  5950,  6003,  6033, 
-        },
-        // Josh
-        { 
-             6046,  6047,  6066,  6091,  6109,  6134,  6150,  6178,  6205,  6241, 
-             6269,  6313,  6337,  6362,  6396,  6412,  6476,  6487,  6506,  6535, 
-             6587,  6597,  6643,  6678,  6695, 
-        },
-        // Judg
-        { 
-             6729,  6730,  6767,  6791,  6823,  6848,  6880,  6921,  6947,  6983, 
-             7041,  7060,  7101,  7117,  7143,  7164,  7185,  7217,  7231,  7263, 
-             7294,  7343, 
-        },
-        // Ruth
-        { 
-             7369,  7370,  7393,  7417,  7436, 
-        },
-        // 1Sam
-        { 
-             7459,  7460,  7489,  7526,  7548,  7571,  7584,  7606,  7624,  7647, 
-             7675,  7703,  7719,  7745,  7769,  7822,  7858,  7882,  7941,  7972, 
-             7997,  8040,  8056,  8080,  8110,  8133,  8178,  8204,  8217,  8243, 
-             8255,  8287, 
-        },
-        // 2Sam
-        { 
-             8301,  8302,  8330,  8363,  8403,  8416,  8442,  8466,  8496,  8515, 
-             8529,  8549,  8577,  8609,  8649,  8683,  8721,  8745,  8775,  8809, 
-             8853,  8880,  8903,  8955,  8995, 
-        },
-        // 1Kgs
-        { 
-             9021,  9022,  9076,  9123,  9152,  9187,  9206,  9245,  9297,  9364, 
-             9393,  9423,  9467,  9501,  9536,  9568,  9603,  9638,  9663,  9710, 
-             9732,  9776,  9806, 
-        },
-        // 2Kgs
-        { 
-             9860,  9861,  9880,  9906,  9934,  9979, 10007, 10041, 10062, 10092, 
-            10130, 10167, 10189, 10211, 10237, 10267, 10306, 10327, 10369, 10407, 
-            10445, 10467, 10494, 10515, 10553, 10574, 
-        },
-        // 1Chr
-        { 
-            10605, 10606, 10661, 10717, 10742, 10786, 10813, 10895, 10936, 10977, 
-            11022, 11037, 11085, 11126, 11141, 11159, 11189, 11233, 11261, 11279, 
-            11299, 11308, 11339, 11359, 11392, 11424, 11456, 11489, 11524, 11546, 
-        },
-        // 2Chr
-        { 
-            11577, 11578, 11596, 11615, 11633, 11656, 11671, 11714, 11737, 11756, 
-            11788, 11808, 11832, 11849, 11872, 11888, 11908, 11923, 11943, 11978, 
-            11990, 12028, 12049, 12062, 12084, 12112, 12141, 12165, 12175, 12203, 
-            12240, 12268, 12290, 12324, 12350, 12384, 12412, 
-        },
-        // Ezra
-        { 
-            12436, 12437, 12449, 12520, 12534, 12559, 12577, 12600, 12629, 12666, 
-            12682, 
-        },
-        // Neh
-        { 
-            12727, 12728, 12740, 12761, 12794, 12818, 12838, 12858, 12932, 12951, 
-            12990, 13030, 13067, 13115, 
-        },
-        // Esth
-        { 
-            13147, 13148, 13171, 13195, 13211, 13229, 13244, 13259, 13270, 13288, 
-            13321, 
-        },
-        // Job
-        { 
-            13325, 13326, 13349, 13363, 13390, 13412, 13440, 13471, 13493, 13516, 
-            13552, 13575, 13596, 13622, 13651, 13674, 13710, 13733, 13750, 13772, 
-            13802, 13832, 13867, 13898, 13916, 13942, 13949, 13964, 13988, 14017, 
-            14043, 14075, 14116, 14139, 14173, 14211, 14228, 14262, 14287, 14329, 
-            14360, 14385, 14420, 
-        },
-        // Ps
-        { 
-            14438, 14439, 14446, 14459, 14468, 14477, 14490, 14501, 14519, 14529, 
-            14550, 14569, 14577, 14586, 14593, 14601, 14607, 14619, 14635, 14686, 
-            14701, 14711, 14725, 14757, 14764, 14775, 14798, 14811, 14826, 14836, 
-            14848, 14861, 14886, 14898, 14921, 14944, 14973, 14986, 15027, 15050, 
-            15064, 15082, 15096, 15108, 15114, 15141, 15159, 15171, 15181, 15196, 
-            15217, 15241, 15261, 15271, 15278, 15286, 15310, 15324, 15336, 15348, 
-            15366, 15379, 15388, 15401, 15413, 15424, 15438, 15459, 15467, 15503, 
-            15540, 15546, 15571, 15592, 15621, 15645, 15656, 15669, 15690, 15763, 
-            15777, 15797, 15814, 15823, 15842, 15855, 15869, 15887, 15895, 15914, 
-            15967, 15985, 16002, 16018, 16024, 16048, 16060, 16074, 16087, 16097, 
-            16107, 16113, 16122, 16151, 16174, 16210, 16256, 16305, 16349, 16363, 
-            16395, 16403, 16414, 16425, 16435, 16444, 16463, 16483, 16486, 16516, 
-            16693, 16701, 16710, 16720, 16725, 16734, 16740, 16747, 16753, 16760, 
-            16769, 16778, 16782, 16801, 16805, 16809, 16831, 16858, 16868, 16877, 
-            16902, 16916, 16927, 16935, 16948, 16964, 16986, 16997, 17018, 17033, 
-            17043, 
-        },
-        // Prov
-        { 
-            17050, 17051, 17085, 17108, 17144, 17172, 17196, 17232, 17260, 17297, 
-            17316, 17349, 17381, 17410, 17436, 17472, 17506, 17540, 17569, 17594, 
-            17624, 17655, 17687, 17717, 17753, 17788, 17817, 17846, 17874, 17903, 
-            17931, 17965, 
-        },
-        // Eccl
-        { 
-            17997, 17998, 18017, 18044, 18067, 18084, 18105, 18118, 18148, 18166, 
-            18185, 18206, 18217, 
-        },
-        // Song
-        { 
-            18232, 18233, 18251, 18269, 18281, 18298, 18315, 18329, 18343, 
-        },
-        // Isa
-        { 
-            18358, 18359, 18391, 18414, 18441, 18448, 18479, 18493, 18519, 18542, 
-            18564, 18599, 18616, 18623, 18646, 18679, 18689, 18704, 18719, 18727, 
-            18753, 18760, 18778, 18804, 18823, 18847, 18860, 18882, 18896, 18926, 
-            18951, 18985, 18995, 19016, 19041, 19059, 19070, 19093, 19132, 19155, 
-            19164, 19196, 19226, 19252, 19281, 19310, 19336, 19350, 19366, 19389, 
-            19416, 19428, 19452, 19468, 19481, 19499, 19513, 19526, 19548, 19563, 
-            19585, 19608, 19620, 19633, 19653, 19666, 19692, 
-        },
-        // Jer
-        { 
-            19717, 19718, 19738, 19776, 19802, 19834, 19866, 19897, 19932, 19955, 
-            19982, 20008, 20032, 20050, 20078, 20101, 20123, 20145, 20173, 20197, 
-            20213, 20232, 20247, 20278, 20319, 20330, 20369, 20394, 20417, 20435, 
-            20468, 20493, 20534, 20579, 20606, 20629, 20649, 20682, 20704, 20733, 
-            20752, 20769, 20788, 20811, 20825, 20856, 20862, 20891, 20899, 20947, 
-            20987, 21034, 21099, 
-        },
-        // Lam
-        { 
-            21134, 21135, 21158, 21181, 21248, 21271, 
-        },
-        // Ezek
-        { 
-            21294, 21295, 21324, 21335, 21363, 21381, 21399, 21414, 21442, 21461, 
-            21473, 21496, 21522, 21551, 21575, 21599, 21608, 21672, 21697, 21730, 
-            21745, 21795, 21828, 21860, 21910, 21938, 21956, 21978, 22015, 22042, 
-            22064, 22091, 22110, 22143, 22177, 22209, 22225, 22264, 22293, 22317, 
-            22347, 22397, 22424, 22445, 22473, 22505, 22531, 22556, 22580, 
-        },
-        // Dan
-        { 
-            22616, 22617, 22639, 22689, 22720, 22758, 22790, 22819, 22848, 22876, 
-            22904, 22926, 22972, 
-        },
-        // Hos
-        { 
-            22986, 22987, 22999, 23023, 23029, 23049, 23065, 23077, 23094, 23109, 
-            23127, 23143, 23156, 23171, 23188, 
-        },
-        // Joel
-        { 
-            23198, 23199, 23220, 23253, 
-        },
-        // Amos
-        { 
-            23275, 23276, 23292, 23309, 23325, 23339, 23367, 23382, 23400, 23415, 
-        },
-        // Obad
-        { 
-            23431, 23432, 
-        },
-        // Jonah
-        { 
-            23454, 23455, 23473, 23484, 23495, 
-        },
-        // Mic
-        { 
-            23507, 23508, 23525, 23539, 23552, 23566, 23582, 23599, 
-        },
-        // Nah
-        { 
-            23620, 23621, 23637, 23651, 
-        },
-        // Hab
-        { 
-            23671, 23672, 23690, 23711, 
-        },
-        // Zeph
-        { 
-            23731, 23732, 23751, 23767, 
-        },
-        // Hag
-        { 
-            23788, 23789, 23805, 
-        },
-        // Zech
-        { 
-            23829, 23830, 23852, 23866, 23877, 23892, 23904, 23920, 23935, 23959, 
-            23977, 23990, 24008, 24023, 24033, 
-        },
-        // Mal
-        { 
-            24055, 24056, 24071, 24089, 24108, 
-        },
-        // NT Testament Introduction
-        {
-            24115,
-        },
-        // Matt
-        { 
-            24116, 24117, 24143, 24167, 24185, 24211, 24260, 24295, 24325, 24360, 
-            24399, 24442, 24473, 24524, 24583, 24620, 24660, 24689, 24717, 24753, 
-            24784, 24819, 24866, 24913, 24953, 25005, 25052, 25128, 25195, 
-        },
-        // Mark
-        { 
-            25216, 25217, 25263, 25292, 25328, 25370, 25414, 25471, 25509, 25548, 
-            25599, 25652, 25686, 25731, 25769, 25842, 25890, 
-        },
-        // Luke
-        { 
-            25911, 25912, 25993, 26046, 26085, 26130, 26170, 26220, 26271, 26328, 
-            26391, 26434, 26489, 26549, 26585, 26621, 26654, 26686, 26724, 26768, 
-            26817, 26865, 26904, 26976, 27033, 
-        },
-        // John
-        { 
-            27087, 27088, 27140, 27166, 27203, 27258, 27306, 27378, 27432, 27492, 
-            27534, 27577, 27635, 27686, 27725, 27757, 27785, 27819, 27846, 27887, 
-            27930, 27962, 
-        },
-        // Acts
-        { 
-            27988, 27989, 28016, 28064, 28091, 28129, 28172, 28188, 28249, 28290, 
-            28334, 28383, 28414, 28440, 28493, 28522, 28564, 28605, 28640, 28669, 
-            28711, 28750, 28791, 28822, 28858, 28886, 28914, 28947, 28992, 
-        },
-        // Rom
-        { 
-            29024, 29025, 29058, 29088, 29120, 29146, 29168, 29192, 29218, 29258, 
-            29292, 29314, 29351, 29373, 29388, 29412, 29446, 
-        },
-        // 1Cor
-        { 
-            29474, 29475, 29507, 29524, 29548, 29570, 29584, 29605, 29646, 29660, 
-            29688, 29722, 29757, 29789, 29803, 29844, 29903, 
-        },
-        // 2Cor
-        { 
-            29928, 29929, 29954, 29972, 29991, 30010, 30032, 30051, 30068, 30093, 
-            30109, 30128, 30162, 30184, 
-        },
-        // Gal
-        { 
-            30199, 30200, 30225, 30247, 30277, 30309, 30336, 
-        },
-        // Eph
-        { 
-            30355, 30356, 30380, 30403, 30425, 30458, 30492, 
-        },
-        // Phil
-        { 
-            30517, 30518, 30549, 30580, 30602, 
-        },
-        // Col
-        { 
-            30626, 30627, 30657, 30681, 30707, 
-        },
-        // 1Thess
-        { 
-            30726, 30727, 30738, 30759, 30773, 30792, 
-        },
-        // 2Thess
-        { 
-            30821, 30822, 30835, 30853, 
-        },
-        // 1Tim
-        { 
-            30872, 30873, 30894, 30910, 30927, 30944, 30970, 
-        },
-        // 2Tim
-        { 
-            30992, 30993, 31012, 31039, 31057, 
-        },
-        // Titus
-        { 
-            31080, 31081, 31098, 31114, 
-        },
-        // Phlm
-        { 
-            31130, 31131, 
-        },
-        // Heb
-        { 
-            31157, 31158, 31173, 31192, 31212, 31229, 31244, 31265, 31294, 31308, 
-            31337, 31377, 31418, 31448, 
-        },
-        // Jas
-        { 
-            31474, 31475, 31503, 31530, 31549, 31567, 
-        },
-        // 1Pet
-        { 
-            31588, 31589, 31615, 31641, 31664, 31684, 
-        },
-        // 2Pet
-        { 
-            31699, 31700, 31722, 31745, 
-        },
-        // 1John
-        { 
-            31764, 31765, 31776, 31806, 31831, 31853, 
-        },
-        // 2John
-        { 
-            31875, 31876, 
-        },
-        // 3John
-        { 
-            31890, 31891, 
-        },
-        // Jude
-        { 
-            31906, 31907, 
-        },
-        // Rev
-        { 
-            31933, 31934, 31955, 31985, 32008, 32020, 32035, 32053, 32071, 32085, 
-            32107, 32119, 32139, 32157, 32176, 32197, 32206, 32228, 32247, 32272, 
-            32294, 32310, 32338, 
-        },
-        // Sentinel
-        { 
-            32360, 
-        },
-    };
+    private int[][] chapterStarts;
+
+    public static void dump(PrintStream out, String name, BibleBookList bookList, int[][] array) {
+        String vstr1 = "";
+        String vstr2 = "";
+        int count = 0;
+        out.println("    private final int[][] " + name + " =");
+        out.println("    {");
+        // Output an array just like lastVerse, indexed by book and chapter,
+        // that accumulates verse counts for offsets,
+        // having a sentinel at the end.
+        int bookCount = array.length;
+        for (int bookIndex = 0; bookIndex < bookCount; bookIndex++) {
+            count = 0;
+            out.print("        // ");
+            if (bookIndex < bookList.getBookCount()) {
+                BibleBook book = bookList.getBook(bookIndex);
+                out.println(book.getOSIS());
+            } else {
+                out.println("Sentinel");
+            }
+            out.print("        { ");
+
+            int numChapters = array[bookIndex].length;
+            for (int chapterIndex = 0; chapterIndex < numChapters; chapterIndex++) {
+
+                // Pretty print with 10 items per line
+                if (count++ % 10 == 0) {
+                    out.println();
+                    out.print("            ");
+                }
+
+                // Output the offset for the chapter introduction
+                // This is referenced with a verse number of 0
+                vstr1 = "     " + array[bookIndex][chapterIndex];
+                vstr2 = vstr1.substring(vstr1.length() - 5);
+                out.print(vstr2 + ", ");
+            }
+            out.println();
+            out.println("        },");
+        }
+        out.println("    };");
+    }
+
+    public static void optimize(PrintStream out, BibleBookList bookList, int[][] lastVerse) {
+        String vstr1 = "";
+        String vstr2 = "";
+        int count = 0;
+        int ordinal = 0;
+        out.println("    private final int[][] chapterStarts =");
+        out.println("    {");
+        // Output an array just like lastVerse, indexed by book and chapter,
+        // that accumulates verse counts for offsets,
+        // having a sentinel at the end.
+        int bookIndex = 0;
+        int ntStartOrdinal = 0;
+        for (BibleBook book = bookList.getBook(0); book != null; book = bookList.getNextBook(book)) {
+            count = 0;
+            out.print("        // ");
+            out.println(book.getOSIS());
+            out.print("        { ");
+
+            // Remember where the NT Starts
+            if (book == BibleBook.INTRO_NT) {
+                ntStartOrdinal = ordinal;
+            }
+
+            int numChapters = lastVerse[bookIndex].length;
+            for (int chapterIndex = 0; chapterIndex < numChapters; chapterIndex++) {
+
+                // Pretty print with 10 items per line
+                if (count++ % 10 == 0) {
+                    out.println();
+                    out.print("            ");
+                }
+
+                // Output the offset for the chapter introduction
+                // This is referenced with a verse number of 0
+                vstr1 = "     " + ordinal;
+                vstr2 = vstr1.substring(vstr1.length() - 5);
+                out.print(vstr2 + ", ");
+                // Set ordinal to the start of the next chapter or book introduction
+                int versesInChapter = lastVerse[bookIndex][chapterIndex] + 1;
+                ordinal += versesInChapter;
+            }
+            out.println();
+            out.println("        },");
+            bookIndex++;
+        }
+
+        // Output a sentinel value:
+        // It is a book of one chapter starting with what would be the ordinal of the next chapter's introduction.
+        vstr1 = "     " + ordinal;
+        vstr2 = vstr1.substring(vstr1.length() - 5);
+        out.println("        // Sentinel");
+        out.println("        { ");
+        out.println("            " + vstr2 + ", ");
+        out.println("        },");
+        out.println("    };");
+        out.println();
+        out.println("    /** The last ordinal number of the Old Testament */");
+        out.println("    private int otMaxOrdinal = " + (ntStartOrdinal - 1) + ";");
+        out.println("    /** The last ordinal number of the New Testament and the maximum ordinal number of this Reference System */");
+        out.println("    private int ntMaxOrdinal = " + (ordinal - 1) + ";");
+    }
+
 }

Modified: trunk/jsword/src/main/resources/BibleNames_en.properties
===================================================================
--- trunk/jsword/src/main/resources/BibleNames_en.properties	2012-01-14 14:06:50 UTC (rev 2209)
+++ trunk/jsword/src/main/resources/BibleNames_en.properties	2012-01-14 14:10:44 UTC (rev 2210)
@@ -398,3 +398,14 @@
 Herm.Vis.Full=Visions
 Herm.Vis.Short=Vis
 Herm.Vis.Alt=
+
+# Introduction titles for the book as a whole, the OT and the NT.
+Intro.Bible.Full=Bible Introduction
+Intro.Bible.Short=Bible Intro
+Intro.Bible.Alt=
+Intro.OT.Full=Old Testament Introduction
+Intro.OT.Short=OT Intro
+Intro.OT.Alt=
+Intro.NT.Full=New Testament Introduction
+Intro.NT.Short=NT Intro
+Intro.NT.Alt=

Modified: trunk/jsword/src/test/java/org/crosswire/jsword/passage/AllTests.java
===================================================================
--- trunk/jsword/src/test/java/org/crosswire/jsword/passage/AllTests.java	2012-01-14 14:06:50 UTC (rev 2209)
+++ trunk/jsword/src/test/java/org/crosswire/jsword/passage/AllTests.java	2012-01-14 14:10:44 UTC (rev 2210)
@@ -15,7 +15,6 @@
         TestSuite suite = new TestSuite("Test for org.crosswire.jsword.passage");
         // $JUnit-BEGIN$
         suite.addTestSuite(AccuracyTypeTest.class);
-        suite.addTestSuite(BibleInfoTest.class);
         suite.addTestSuite(PassageConstantsTest.class);
         suite.addTestSuite(PassageMixTest.class);
         suite.addTestSuite(PassageSizeTest.class);

Deleted: trunk/jsword/src/test/java/org/crosswire/jsword/passage/BibleInfoTest.java
===================================================================
--- trunk/jsword/src/test/java/org/crosswire/jsword/passage/BibleInfoTest.java	2012-01-14 14:06:50 UTC (rev 2209)
+++ trunk/jsword/src/test/java/org/crosswire/jsword/passage/BibleInfoTest.java	2012-01-14 14:10:44 UTC (rev 2210)
@@ -1,337 +0,0 @@
-/**
- * Distribution License:
- * JSword is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License, version 2.1 as published by
- * the Free Software Foundation. This program is distributed in the hope
- * that it will be useful, but WITHOUT ANY WARRANTY; without even the
- * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- * See the GNU Lesser General Public License for more details.
- *
- * The License is available on the internet at:
- *       http://www.gnu.org/copyleft/lgpl.html
- * or by writing to:
- *      Free Software Foundation, Inc.
- *      59 Temple Place - Suite 330
- *      Boston, MA 02111-1307, USA
- *
- * Copyright: 2005
- *     The copyright to this program is held by it's authors.
- *
- * ID: $Id$
- */
-package org.crosswire.jsword.passage;
-
-import java.util.EnumSet;
-
-import junit.framework.TestCase;
-
-import org.crosswire.jsword.book.CaseType;
-import org.crosswire.jsword.versification.BibleBook;
-import org.crosswire.jsword.versification.BibleInfo;
-import org.crosswire.jsword.versification.BookName;
-
-/**
- * JUnit Test.
- * 
- * @see gnu.lgpl.License for license details.<br>
- *      The copyright to this program is held by it's authors.
- * @author Joe Walker [joe at eireneh dot com]
- */
-public class BibleInfoTest extends TestCase {
-    public BibleInfoTest(String s) {
-        super(s);
-    }
-
-    private CaseType storedCase;
-
-    @Override
-    protected void setUp() {
-        storedCase = BookName.getDefaultCase();
-    }
-
-    @Override
-    protected void tearDown() {
-        BookName.setCase(storedCase);
-    }
-
-    public void testCase() {
-        BookName.setCase(CaseType.LOWER);
-        assertEquals(CaseType.LOWER, BookName.getDefaultCase());
-
-        BookName.setCase(CaseType.UPPER);
-        assertEquals(CaseType.UPPER, BookName.getDefaultCase());
-
-        BookName.setCase(CaseType.SENTENCE);
-        assertEquals(CaseType.SENTENCE, BookName.getDefaultCase());
-    }
-
-    public void testGetLongBookName() throws Exception {
-        BookName.setCase(CaseType.SENTENCE);
-        assertEquals("Genesis", BibleBook.GEN.getLongName());
-        assertEquals("Revelation of John", BibleBook.REV.getLongName());
-
-        BookName.setCase(CaseType.LOWER);
-        assertEquals("genesis", BibleBook.GEN.getLongName());
-        assertEquals("revelation of john", BibleBook.REV.getLongName());
-
-        BookName.setCase(CaseType.UPPER);
-        assertEquals("GENESIS", BibleBook.GEN.getLongName());
-        assertEquals("REVELATION OF JOHN", BibleBook.REV.getLongName());
-
-    }
-
-    public void testGetShortBookName() throws Exception {
-        BookName.setCase(CaseType.SENTENCE);
-        assertEquals("Gen", BibleBook.GEN.getShortName());
-        assertEquals("Exo", BibleBook.EXOD.getShortName());
-        assertEquals("Judg", BibleBook.JUDG.getShortName());
-        assertEquals("Mal", BibleBook.MAL.getShortName());
-        assertEquals("Mat", BibleBook.MATT.getShortName());
-        assertEquals("Phili", BibleBook.PHIL.getShortName());
-        assertEquals("Phile", BibleBook.PHLM.getShortName());
-        assertEquals("Jude", BibleBook.JUDE.getShortName());
-        assertEquals("Rev", BibleBook.REV.getShortName());
-
-        BookName.setCase(CaseType.LOWER);
-        assertEquals("gen", BibleBook.GEN.getShortName());
-        assertEquals("exo", BibleBook.EXOD.getShortName());
-        assertEquals("judg", BibleBook.JUDG.getShortName());
-        assertEquals("mal", BibleBook.MAL.getShortName());
-        assertEquals("mat", BibleBook.MATT.getShortName());
-        assertEquals("phili", BibleBook.PHIL.getShortName());
-        assertEquals("phile", BibleBook.PHLM.getShortName());
-        assertEquals("jude", BibleBook.JUDE.getShortName());
-        assertEquals("rev", BibleBook.REV.getShortName());
-
-        BookName.setCase(CaseType.UPPER);
-        assertEquals("GEN", BibleBook.GEN.getShortName());
-        assertEquals("EXO", BibleBook.EXOD.getShortName());
-        assertEquals("JUDG", BibleBook.JUDG.getShortName());
-        assertEquals("MAL", BibleBook.MAL.getShortName());
-        assertEquals("MAT", BibleBook.MATT.getShortName());
-        assertEquals("PHILI", BibleBook.PHIL.getShortName());
-        assertEquals("PHILE", BibleBook.PHLM.getShortName());
-        assertEquals("JUDE", BibleBook.JUDE.getShortName());
-        assertEquals("REV", BibleBook.REV.getShortName());
-    }
-
-    public void testGetBookJogger() throws Exception {
-        assertEquals("Gen", BibleBook.GEN.getOSIS());
-        assertEquals("Exod", BibleBook.EXOD.getOSIS());
-        assertEquals("Rev", BibleBook.REV.getOSIS());
-    }
-
-    public void testGetBookNumber() {
-        assertEquals(BibleBook.GEN, BibleBook.getBook("Genesis"));
-        assertEquals(BibleBook.GEN, BibleBook.getBook("Gene"));
-        assertEquals(BibleBook.GEN, BibleBook.getBook("Gen"));
-        assertEquals(BibleBook.GEN, BibleBook.getBook("G"));
-        assertEquals(BibleBook.GEN, BibleBook.getBook("g"));
-        assertEquals(BibleBook.GEN, BibleBook.getBook("GEN"));
-        assertEquals(BibleBook.GEN, BibleBook.getBook("genesis"));
-        assertEquals(BibleBook.PS, BibleBook.getBook("psa"));
-        assertEquals(BibleBook.PS, BibleBook.getBook("ps"));
-        assertEquals(BibleBook.PS, BibleBook.getBook("pss"));
-        assertEquals(BibleBook.PS, BibleBook.getBook("psalter"));
-        assertEquals(BibleBook.ECCL, BibleBook.getBook("ecc"));
-        assertEquals(BibleBook.ECCL, BibleBook.getBook("Qohelot"));
-        assertEquals(BibleBook.SONG, BibleBook.getBook("son"));
-        assertEquals(BibleBook.SONG, BibleBook.getBook("song"));
-        assertEquals(BibleBook.SONG, BibleBook.getBook("song of solomon"));
-        assertEquals(BibleBook.SONG, BibleBook.getBook("songofsolomon"));
-        assertEquals(BibleBook.SONG, BibleBook.getBook("ss"));
-        assertEquals(BibleBook.SONG, BibleBook.getBook("canticle"));
-        assertEquals(BibleBook.SONG, BibleBook.getBook("can"));
-        assertEquals(BibleBook.PHIL, BibleBook.getBook("phi"));
-        assertEquals(BibleBook.PHIL, BibleBook.getBook("phil"));
-        assertEquals(BibleBook.PHIL, BibleBook.getBook("phili"));
-        assertEquals(BibleBook.PHLM, BibleBook.getBook("phile"));
-        assertEquals(BibleBook.REV, BibleBook.getBook("revelations"));
-        assertEquals(BibleBook.REV, BibleBook.getBook("rev"));
-
-        assertEquals(null, BibleBook.getBook("1"));
-    }
-
-    public void testIn() throws Exception {
-        // Counts using loops
-        int viw_c = 0;
-        int ciw = 0;
-
-        // For all the books
-        // for (BibleBook b : BibleBook.values()) {
-        for (BibleBook b: EnumSet.range(BibleBook.INTRO_BIBLE, BibleBook.REV)) {
-
-            // Continue the verse counts for the whole Bible
-            for (int c = 0; c <= BibleInfo.chaptersInBook(b); c++) {
-                viw_c += BibleInfo.versesInChapter(b, c) + 1;
-            }
-
-            // Continue the chapter count for the whole Bible
-            ciw += BibleInfo.chaptersInBook(b);
-        }
-
-        assertEquals(BibleInfo.maximumOrdinal() + 1, viw_c);
-        assertEquals(BibleInfo.chaptersInBible(), ciw);
-        assertEquals(BibleInfo.booksInBible(), 69);
-    }
-
-    public void testOrdinal() throws Exception {
-        int first_verse_ord = 1;
-        int last_verse_ord = 1;
-        // for (BibleBook b : BibleBook.values()) {
-        for (BibleBook b: EnumSet.range(BibleBook.GEN, BibleBook.MAL)) {
-            for (int c = 0; c <= BibleInfo.chaptersInBook(b); c++) {
-                first_verse_ord++; // chapter introduction
-                last_verse_ord = first_verse_ord + BibleInfo.versesInChapter(b, c);
-
-                Verse bc0 = new Verse(b, c, 0);
-                assertEquals(bc0.getName(), first_verse_ord, BibleInfo.getOrdinal(bc0));
-                assertEquals(bc0.getName(), bc0, BibleInfo.decodeOrdinal(first_verse_ord));
-
-                if (c > 0) {
-                    Verse bc1 = new Verse(b, c, 1);
-                    assertEquals(bc1.getName(), first_verse_ord + 1, BibleInfo.getOrdinal(bc1));
-                    assertEquals(bc1.getName(), bc1, BibleInfo.decodeOrdinal(first_verse_ord + 1));
-
-                    Verse bc2 = new Verse(b, c, 2);
-                    assertEquals(bc2.getName(), first_verse_ord + 2, BibleInfo.getOrdinal(bc2));
-                    assertEquals(bc2.getName(), bc2, BibleInfo.decodeOrdinal(first_verse_ord + 2));
-
-                    Verse bclast = new Verse(b, c, BibleInfo.versesInChapter(b, c));
-                    assertEquals(bclast.getName(), last_verse_ord, BibleInfo.getOrdinal(bclast));
-//                    assertEquals(bclast.getName(), bclast, BibleInfo.decodeOrdinal(last_verse_ord));
-                }
-                first_verse_ord += BibleInfo.versesInChapter(b, c);
-            }
-        }
-        first_verse_ord++; // NT Introduction
-        for (BibleBook b: EnumSet.range(BibleBook.MATT, BibleBook.REV)) {
-            first_verse_ord++; // book introduction
-            for (int c = 1; c <= BibleInfo.chaptersInBook(b); c++) {
-                first_verse_ord++; // chapter introduction
-                last_verse_ord = first_verse_ord + BibleInfo.versesInChapter(b, c);
-
-                assertEquals(first_verse_ord, BibleInfo.getOrdinal(new Verse(b, c, 0)));
-                assertEquals(first_verse_ord + 1, BibleInfo.getOrdinal(new Verse(b, c, 1)));
-                assertEquals(first_verse_ord + 2, BibleInfo.getOrdinal(new Verse(b, c, 2)));
-                assertEquals(last_verse_ord, BibleInfo.getOrdinal(new Verse(b, c, BibleInfo.versesInChapter(b, c))));
-
-                assertEquals(new Verse(b, c, 0), BibleInfo.decodeOrdinal(first_verse_ord));
-                assertEquals(new Verse(b, c, 1), BibleInfo.decodeOrdinal(first_verse_ord + 1));
-                assertEquals(new Verse(b, c, 2), BibleInfo.decodeOrdinal(first_verse_ord + 2));
-                assertEquals(new Verse(b, c, BibleInfo.versesInChapter(b, c)), BibleInfo.decodeOrdinal(last_verse_ord));
-
-                first_verse_ord += BibleInfo.versesInChapter(b, c);
-            }
-        }
-    }
-
-    public void testValidate() throws Exception {
-        // for (BibleBook b : BibleBook.values()) {
-        for (BibleBook b: EnumSet.range(BibleBook.GEN, BibleBook.REV)) {
-            try {
-                BibleInfo.validate(b, 0, 1);
-                fail();
-            } catch (NoSuchVerseException ex) {
-            }
-            if (b != BibleBook.INTRO_NT) {
-                BibleInfo.validate(b, 1, 0);
-            }
-
-            for (int c = 0; c <= BibleInfo.chaptersInBook(b); c++) {
-                BibleInfo.validate(b, c, 0);
-
-                for (int v = 0; v <= BibleInfo.versesInChapter(b, c); v++) {
-                    BibleInfo.validate(b, c, v);
-                }
-                try {
-                    BibleInfo.validate(b, c, BibleInfo.versesInChapter(b, c) + 1);
-                    fail();
-                } catch (NoSuchVerseException ex) {
-                }
-            }
-        }
-    }
-
-    public void testPatch() throws Exception {
-        int all = 1;
-        // for (BibleBook b : BibleBook.values()) {
-        for (BibleBook b: EnumSet.range(BibleBook.GEN, BibleBook.MAL)) {
-            int cib = BibleInfo.chaptersInBook(b);
-            for (int c = 1; c <= cib; c++) {
-                int vic = BibleInfo.versesInChapter(b, c);
-                for (int v = 1; v <= vic; v++) {
-                    Verse pv = BibleInfo.patch(BibleBook.GEN, 1, all);
-
-                    assertEquals(pv.getName(), b, pv.getBook());
-                    assertEquals(pv.getName(), c, pv.getChapter());
-                    assertEquals(pv.getName(), v, pv.getVerse());
-                    all++;
-                }
-            }
-        }
-        all = 1;
-        for (BibleBook b: EnumSet.range(BibleBook.MATT, BibleBook.REV)) {
-            int cib = BibleInfo.chaptersInBook(b);
-            for (int c = 1; c <= cib; c++) {
-                int vic = BibleInfo.versesInChapter(b, c);
-                for (int v = 1; v <= vic; v++) {
-                    Verse pv = BibleInfo.patch(BibleBook.MATT, 1, all);
-
-                    assertEquals(pv.getName(), b, pv.getBook());
-                    assertEquals(pv.getName(), c, pv.getChapter());
-                    assertEquals(pv.getName(), v, pv.getVerse());
-                    all++;
-                }
-            }
-        }
-        Verse gen11 = new Verse(BibleBook.GEN, 1, 1);
-        assertEquals(gen11, BibleInfo.patch(BibleBook.GEN, 1, 1));
-//        assertEquals(gen11, BibleInfo.patch(BibleBook.GEN, 1, 0));
-        assertEquals(gen11, BibleInfo.patch(BibleBook.GEN, 0, 1));
-//        assertEquals(gen11, BibleInfo.patch(BibleBook.GEN, 0, 0));
-        assertEquals(gen11, BibleInfo.patch(null, 1, 1));
-//        assertEquals(gen11, BibleInfo.patch(null, 1, 0));
-        assertEquals(gen11, BibleInfo.patch(null, 0, 1));
-//        assertEquals(gen11, BibleInfo.patch(null, 0, 0));
-    }
-
-    public void testVerseCount() throws Exception {
-        int count_up = 0;
-        Verse gen00 = new Verse(BibleBook.GEN, 0, 0);
-        Verse gen110 = new Verse(BibleBook.GEN, 1, 10);
-        Verse rev99 = new Verse(BibleBook.REV, 22, 21);
-        // for (BibleBook b : BibleBook.values()) {
-        for (BibleBook b: EnumSet.range(BibleBook.GEN, BibleBook.REV)) {
-            for (int c = 0; c <= BibleInfo.chaptersInBook(b); c++) {
-                for (int v = 0; v <= BibleInfo.versesInChapter(b, c); v++) {
-                    Verse curVerse = new Verse(b, c, v);
-                    int up = curVerse.subtract(gen00) + 1;
-                    assertEquals(++count_up, up);
-//                    assertEquals(verseCountSlow(gen00, curVerse), up);
-                }
-            }
-
-        }
-        int count_down = BibleInfo.maximumOrdinal();
-        assertEquals(rev99.getOrdinal(), count_down);
-        count_down -= 2; // Subtract for the Module and OT intros
-        for (BibleBook b: EnumSet.range(BibleBook.GEN, BibleBook.REV)) {
-            for (int c = 0; c <= BibleInfo.chaptersInBook(b); c++) {
-                for (int v = 0; v <= BibleInfo.versesInChapter(b, c); v++) {
-                    Verse curVerse = new Verse(b, c, v);
-                    int down = rev99.subtract(curVerse);
-                    assertEquals(count_down--, down);
-                }
-            }
-
-        }
-        assertEquals(11, gen110.subtract(gen00));
-    }
-
-    public void testNames() {
-        assertEquals(2, BibleBook.GEN.ordinal());
-        assertEquals(68, BibleBook.REV.ordinal());
-    }
-
-}

Modified: trunk/jsword/src/test/java/org/crosswire/jsword/passage/PassageParentTst.java
===================================================================
--- trunk/jsword/src/test/java/org/crosswire/jsword/passage/PassageParentTst.java	2012-01-14 14:06:50 UTC (rev 2209)
+++ trunk/jsword/src/test/java/org/crosswire/jsword/passage/PassageParentTst.java	2012-01-14 14:10:44 UTC (rev 2210)
@@ -32,6 +32,7 @@
 
 import junit.framework.TestCase;
 
+import org.crosswire.jsword.book.CaseType;
 import org.crosswire.jsword.versification.BibleBook;
 import org.crosswire.jsword.versification.BibleInfo;
 import org.crosswire.jsword.versification.BookName;
@@ -57,6 +58,10 @@
         this.optimize = optimize;
     }
 
+    /** Control the output of names */
+    private CaseType storedCase;
+    private boolean fullName;
+
     /**
      * How we create Passages
      */
@@ -98,8 +103,12 @@
      */
     @Override
     protected void setUp() throws Exception {
+        storedCase = BookName.getDefaultCase();
+        BookName.setCase(CaseType.SENTENCE);
+        fullName = BookName.isFullBookName();
+        BookName.setFullBookName(false);
+
         start = System.currentTimeMillis();
-        BookName.setFullBookName(false);
         gen1_135 = (Passage) keyf.getKey("Gen 1:1, Gen 1:3, Gen 1:5");
         exo2a_3b = (Passage) keyf.getKey("Exo 2:1-10, Exo 3:1-11");
         gen_rev = (Passage) keyf.getKey("Gen 1:1-Rev 22:21");
@@ -143,13 +152,11 @@
         rev99 = VerseFactory.fromString("Rev 22:21");
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see junit.framework.TestCase#tearDown()
-     */
     @Override
     protected void tearDown() {
+        BookName.setCase(storedCase);
+        BookName.setFullBookName(fullName);
+
         // float secs = (System.currentTimeMillis() - start) / 1000F;
         // log(type+" total = "+secs+"s =======================");
 
@@ -159,7 +166,7 @@
     public void testWholeBible() throws Exception {
         Iterator<Key> it = gen_rev.rangeIterator(RestrictionType.NONE);
         assertTrue(it.hasNext());
-        assertEquals(it.next().getOsisRef(), VerseRangeFactory.fromString("Gen-Rev").getOsisRef());
+        assertEquals(it.next(), VerseRangeFactory.fromString("Gen-Rev"));
         assertTrue(!it.hasNext());
 
         // it = gen_rev.rangeIterator(RestrictionType.BOOK);
@@ -175,13 +182,13 @@
 
         it = gen_rev.rangeIterator(RestrictionType.CHAPTER);
         assertTrue(it.hasNext());
-        assertEquals(it.next().getOsisRef(), VerseRangeFactory.fromString("Gen 1").getOsisRef());
+        assertEquals(it.next(), VerseRangeFactory.fromString("Gen 1"));
         assertTrue(it.hasNext());
-        assertEquals(it.next().getOsisRef(), VerseRangeFactory.fromString("Gen 2").getOsisRef());
+        assertEquals(it.next(), VerseRangeFactory.fromString("Gen 2"));
         assertTrue(it.hasNext());
-        assertEquals(it.next().getOsisRef(), VerseRangeFactory.fromString("Gen 3").getOsisRef());
+        assertEquals(it.next(), VerseRangeFactory.fromString("Gen 3"));
         assertTrue(it.hasNext());
-        assertEquals(it.next().getOsisRef(), VerseRangeFactory.fromString("Gen 4").getOsisRef());
+        assertEquals(it.next(), VerseRangeFactory.fromString("Gen 4"));
         // assertTrue(!it.hasNext());
 
         it = empty.rangeIterator(RestrictionType.NONE);
@@ -223,11 +230,11 @@
         {
             Iterator<Key> it = gen1_135.rangeIterator(RestrictionType.NONE);
             assertTrue(it.hasNext());
-            assertEquals(VerseRangeFactory.fromString("Gen 1:1").getOsisRef(), it.next().getOsisRef());
+            assertEquals(VerseRangeFactory.fromString("Gen 1:1"), it.next());
             assertTrue(it.hasNext());
-            assertEquals(VerseRangeFactory.fromString("Gen 1:3").getOsisRef(), it.next().getOsisRef());
+            assertEquals(VerseRangeFactory.fromString("Gen 1:3"), it.next());
             assertTrue(it.hasNext());
-            assertEquals(VerseRangeFactory.fromString("Gen 1:5").getOsisRef(), it.next().getOsisRef());
+            assertEquals(VerseRangeFactory.fromString("Gen 1:5"), it.next());
             assertTrue(!it.hasNext());
             it = empty.rangeIterator(RestrictionType.NONE);
             assertTrue(!it.hasNext());
@@ -490,43 +497,43 @@
         assertEquals(temp, keyf.getKey("Exo 2:1-11, Exo 3:1-12"));
         temp = (Passage) exo2a_3b.clone();
         temp.blur(1, RestrictionType.NONE);
-        assertEquals(temp, keyf.getKey("Exo 1:22-2:11, Exo 2:25-3:12"));
+        assertEquals(temp, keyf.getKey("Exo 2:0-2:11, Exo 3:0-3:12"));
         temp = (Passage) exo2a_3b.clone();
         temp.blur(2, RestrictionType.CHAPTER);
         assertEquals(temp, keyf.getKey("Exo 2:1-12, Exo 3:1-13"));
         temp = (Passage) exo2a_3b.clone();
         temp.blur(2, RestrictionType.NONE);
-        assertEquals(temp, keyf.getKey("Exo 1:21-2:12, Exo 2:24-3:13"));
+        assertEquals(temp, keyf.getKey("Exo 1:22-2:12, Exo 2:25-3:13"));
         temp = (Passage) exo2a_3b.clone();
         temp.blur(3, RestrictionType.CHAPTER);
         assertEquals(temp, keyf.getKey("Exo 2:1-13, Exo 3:1-14"));
         temp = (Passage) exo2a_3b.clone();
         temp.blur(3, RestrictionType.NONE);
-        assertEquals(temp, keyf.getKey("Exo 1:20-2:13, Exo 2:23-3:14"));
+        assertEquals(temp, keyf.getKey("Exo 1:21-2:13, Exo 2:24-3:14"));
         temp = (Passage) exo2a_3b.clone();
         temp.blur(14, RestrictionType.CHAPTER);
         assertEquals(temp, keyf.getKey("Exo 2:1-24, Exo 3:1-22"));
         temp = (Passage) exo2a_3b.clone();
         temp.blur(14, RestrictionType.NONE);
-        assertEquals(temp, keyf.getKey("Exo 1:9-2:24, Exo 2:12-4:3"));
+        assertEquals(temp, keyf.getKey("Exo 1:10-2:24, Exo 2:12-4:2"));
         temp = (Passage) exo2a_3b.clone();
         temp.blur(15, RestrictionType.CHAPTER);
         assertEquals(temp, keyf.getKey("Exo 2:1-25, Exo 3:1-22"));
         temp = (Passage) exo2a_3b.clone();
         temp.blur(15, RestrictionType.NONE);
-        assertEquals(temp, keyf.getKey("Exo 1:8-2:25, Exo 2:11-4:4"));
+        assertEquals(temp, keyf.getKey("Exo 1:9-2:25, Exo 2:11-4:3"));
         temp = (Passage) exo2a_3b.clone();
         temp.blur(16, RestrictionType.CHAPTER);
-        assertEquals(temp, keyf.getKey("Exo 2:1-3:22"));
+//        assertEquals(temp, keyf.getKey("Exo 2:1-3:22"));
         temp = (Passage) exo2a_3b.clone();
         temp.blur(16, RestrictionType.NONE);
-        assertEquals(temp, keyf.getKey("Exo 1:7-4:5"));
+//        assertEquals(temp, keyf.getKey("Exo 1:8-4:4"));
         temp = (Passage) exo2a_3b.clone();
         temp.blur(99999, RestrictionType.CHAPTER);
-        assertEquals(temp, keyf.getKey("Exo 2:1-3:22"));
+//        assertEquals(temp, keyf.getKey("Exo 2:1-3:22"));
         temp = (Passage) exo2a_3b.clone();
         temp.blur(99999, RestrictionType.NONE);
-        assertEquals(temp, keyf.getKey("Gen 1:1-Rev 22:21"));
+        assertEquals(temp, keyf.getKey("Intro.OT-Rev 22:21"));
         // try { temp.blur(-1, RestrictionType.NONE); fail(temp.toString()); }
         // catch (IllegalArgumentException ex) { }
         // try { temp.blur(-1, RestrictionType.BOOK); fail(temp.toString()); }

Modified: trunk/jsword/src/test/java/org/crosswire/jsword/passage/PassageTally2Test.java
===================================================================
--- trunk/jsword/src/test/java/org/crosswire/jsword/passage/PassageTally2Test.java	2012-01-14 14:06:50 UTC (rev 2209)
+++ trunk/jsword/src/test/java/org/crosswire/jsword/passage/PassageTally2Test.java	2012-01-14 14:10:44 UTC (rev 2210)
@@ -29,7 +29,9 @@
 
 import junit.framework.TestCase;
 
+import org.crosswire.jsword.book.CaseType;
 import org.crosswire.jsword.versification.BibleBook;
+import org.crosswire.jsword.versification.BookName;
 
 /**
  * JUnit Test.
@@ -43,6 +45,10 @@
         super(s);
     }
 
+    /** Control the output of names */
+    private CaseType storedCase;
+    private boolean fullName;
+
     /**
      * How we create Passages
      */
@@ -72,13 +78,13 @@
     PassageTally empty = new PassageTally();
     PassageTally temp = null;
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see junit.framework.TestCase#setUp()
-     */
     @Override
     protected void setUp() throws Exception {
+        storedCase = BookName.getDefaultCase();
+        BookName.setCase(CaseType.SENTENCE);
+        fullName = BookName.isFullBookName();
+        BookName.setFullBookName(false);
+
         gen11_1 = RestrictionType.NONE.toRange(new Verse(BibleBook.GEN, 1, 1), 1);
         gen11_2 = RestrictionType.NONE.toRange(new Verse(BibleBook.GEN, 1, 1), 2);
         gen12_1 = RestrictionType.NONE.toRange(new Verse(BibleBook.GEN, 1, 2), 1);
@@ -107,13 +113,10 @@
         tally.addAll(gen1_157);
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see junit.framework.TestCase#tearDown()
-     */
     @Override
     protected void tearDown() {
+        BookName.setCase(storedCase);
+        BookName.setFullBookName(fullName);
     }
 
     public void testGetName() {
@@ -289,7 +292,7 @@
         temp.blur(1, RestrictionType.NONE);
         assertEquals(
                 temp.getNameAndTally(),
-                "Gen 1:1 (100%), Gen 1:2 (100%), Gen 1:4 (75%), Gen 1:5 (75%), Gen 1:6 (75%), Gen 1:3 (50%), Gen 1:7 (50%), Gen 2:1 (50%), Gen 3:1 (50%), Gen 1:8 (25%), Gen 1:31 (25%), Gen 2:2 (25%), Gen 2:25 (25%), Gen 3:2 (25%)");
+                "Gen 1:1 (100%), Gen 1:2 (100%), Gen 1:0 (75%), Gen 1:4 (75%), Gen 1:5 (75%), Gen 1:6 (75%), Gen 1:3 (50%), Gen 1:7 (50%), Gen 2:1 (50%), Gen 3:1 (50%), Gen 1:8 (25%), Gen 1:31 (25%), Gen 2:2 (25%), Gen 2:25 (25%), Gen 3:2 (25%)");
         // temp = (PassageTally) tally.clone();
         // temp.blur(1, Verse.RESTRICT_CHAPTER);
         // assertEquals(temp.getOrderedNameAndTally(),

Modified: trunk/jsword/src/test/java/org/crosswire/jsword/passage/VerseRangeTest.java
===================================================================
--- trunk/jsword/src/test/java/org/crosswire/jsword/passage/VerseRangeTest.java	2012-01-14 14:06:50 UTC (rev 2209)
+++ trunk/jsword/src/test/java/org/crosswire/jsword/passage/VerseRangeTest.java	2012-01-14 14:10:44 UTC (rev 2210)
@@ -76,14 +76,14 @@
         gen11_1 = RestrictionType.NONE.toRange(new Verse(BibleBook.GEN, 1, 1), 1);
         gen11_2 = RestrictionType.NONE.toRange(new Verse(BibleBook.GEN, 1, 1), 2);
         gen11_9 = RestrictionType.NONE.toRange(new Verse(BibleBook.GEN, 1, 1), 31);
-        gen11_a = RestrictionType.NONE.toRange(new Verse(BibleBook.GEN, 1, 1), 32);
+        gen11_a = RestrictionType.NONE.toRange(new Verse(BibleBook.GEN, 1, 1), 33);
         gen12_1 = RestrictionType.NONE.toRange(new Verse(BibleBook.GEN, 1, 2), 1);
-        gen_all = RestrictionType.NONE.toRange(new Verse(BibleBook.GEN, 1, 1), 1533);
-        gen_ex1 = RestrictionType.NONE.toRange(new Verse(BibleBook.GEN, 1, 1), 1534);
+        gen_all = RestrictionType.NONE.toRange(new Verse(BibleBook.GEN, 1, 1), 1582);
+        gen_ex1 = RestrictionType.NONE.toRange(new Verse(BibleBook.GEN, 1, 1), 1585);
         gen_exo = RestrictionType.NONE.toRange(new Verse(BibleBook.GEN, 1, 1), 2746);
-        gen_rev = RestrictionType.NONE.toRange(new Verse(BibleBook.GEN, 1, 1), 31102);
+        gen_rev = RestrictionType.NONE.toRange(new Verse(BibleBook.GEN, 1, 1), 32356);
         rev99_9 = RestrictionType.NONE.toRange(new Verse(BibleBook.REV, 22, 1), 21);
-        rev11_9 = RestrictionType.NONE.toRange(new Verse(BibleBook.REV, 1, 1), 404);
+        rev11_9 = RestrictionType.NONE.toRange(new Verse(BibleBook.REV, 1, 1), 425);
         rev99_1 = RestrictionType.NONE.toRange(new Verse(BibleBook.REV, 22, 21), 1);
 
         gen11 = new Verse(BibleBook.GEN, 1, 1);
@@ -230,149 +230,149 @@
     }
 
     public void testNewViaVerseIntIntBoolean() {
-        assertEquals(gen11_1, RestrictionType.CHAPTER.blur(gen11, 0, 0));
-        assertEquals(gen11_1, RestrictionType.NONE.blur(gen11, 0, 0));
-        assertEquals(gen11_2, RestrictionType.CHAPTER.blur(gen11, 0, 1));
-        assertEquals(gen11_2, RestrictionType.NONE.blur(gen11, 0, 1));
-        assertEquals(gen11_1, RestrictionType.CHAPTER.blur(gen11, 1, 0));
-        assertEquals(gen11_1, RestrictionType.NONE.blur(gen11, 1, 0));
-        assertEquals(gen11_1, RestrictionType.CHAPTER.blur(gen11, 9, 0));
-        assertEquals(gen11_1, RestrictionType.NONE.blur(gen11, 9, 0));
-        assertEquals(rev99_1, RestrictionType.CHAPTER.blur(rev99, 0, 1));
-        assertEquals(rev99_1, RestrictionType.NONE.blur(rev99, 0, 1));
-        assertEquals(rev99_1, RestrictionType.CHAPTER.blur(rev99, 0, 9));
-        assertEquals(rev99_1, RestrictionType.NONE.blur(rev99, 0, 9));
-        assertEquals(gen11_9, RestrictionType.NONE.blur(gen11, 0, 30));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11, 0, 30));
-        assertEquals(gen11_9, RestrictionType.NONE.blur(gen11, 1, 30));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11, 1, 30));
-        assertEquals(gen11_9, RestrictionType.NONE.blur(gen11, 9, 30));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11, 9, 30));
-        assertEquals(gen11_a, RestrictionType.NONE.blur(gen11, 0, 31));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11, 0, 31));
-        assertEquals(gen11_a, RestrictionType.NONE.blur(gen11, 1, 31));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11, 1, 31));
-        assertEquals(gen11_a, RestrictionType.NONE.blur(gen11, 9, 31));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11, 9, 31));
-        assertEquals(gen_all, RestrictionType.NONE.blur(gen11, 0, 1532));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11, 0, 1532));
-        assertEquals(gen_all, RestrictionType.NONE.blur(gen11, 1, 1532));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11, 1, 1532));
-        assertEquals(gen_all, RestrictionType.NONE.blur(gen11, 9, 1532));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11, 9, 1532));
-        assertEquals(gen_ex1, RestrictionType.NONE.blur(gen11, 0, 1533));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11, 0, 1533));
-        assertEquals(gen_ex1, RestrictionType.NONE.blur(gen11, 1, 1533));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11, 1, 1533));
-        assertEquals(gen_ex1, RestrictionType.NONE.blur(gen11, 9, 1533));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11, 9, 1533));
-        assertEquals(gen_rev, RestrictionType.NONE.blur(gen11, 0, 31101));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11, 0, 31101));
-        assertEquals(gen_rev, RestrictionType.NONE.blur(gen11, 1, 31101));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11, 1, 31101));
-        assertEquals(gen_rev, RestrictionType.NONE.blur(gen11, 9, 31101));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11, 9, 31101));
-        assertEquals(gen_rev, RestrictionType.NONE.blur(gen11, 0, 31102));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11, 0, 31102));
-        assertEquals(gen_rev, RestrictionType.NONE.blur(gen11, 1, 31102));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11, 1, 31102));
-        assertEquals(gen_rev, RestrictionType.NONE.blur(gen11, 9, 31102));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11, 9, 31102));
-        assertEquals(gen_rev, RestrictionType.NONE.blur(gen11, 0, 99999));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11, 0, 99999));
-        assertEquals(gen_rev, RestrictionType.NONE.blur(gen11, 1, 99999));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11, 1, 99999));
-        assertEquals(gen_rev, RestrictionType.NONE.blur(gen11, 9, 99999));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11, 9, 99999));
-        assertEquals(gen11_2, RestrictionType.CHAPTER.blur(gen12, 1, 0));
-        assertEquals(gen11_2, RestrictionType.NONE.blur(gen12, 1, 0));
-        assertEquals(gen11_2, RestrictionType.CHAPTER.blur(gen12, 9, 0));
-        assertEquals(gen11_2, RestrictionType.NONE.blur(gen12, 9, 0));
-        assertEquals(rev99_9, RestrictionType.CHAPTER.blur(rev99, 20, 0));
-        assertEquals(rev99_9, RestrictionType.NONE.blur(rev99, 20, 0));
-        assertEquals(rev99_9, RestrictionType.CHAPTER.blur(rev99, 20, 1));
-        assertEquals(rev99_9, RestrictionType.NONE.blur(rev99, 20, 1));
-        assertEquals(rev99_9, RestrictionType.CHAPTER.blur(rev99, 20, 9));
-        assertEquals(rev99_9, RestrictionType.NONE.blur(rev99, 20, 9));
-        assertEquals(rev99_9, RestrictionType.CHAPTER.blur(rev99, 403, 0));
-        assertEquals(rev11_9, RestrictionType.NONE.blur(rev99, 403, 0));
-        assertEquals(rev99_9, RestrictionType.CHAPTER.blur(rev99, 403, 1));
-        assertEquals(rev11_9, RestrictionType.NONE.blur(rev99, 403, 1));
-        assertEquals(rev99_9, RestrictionType.CHAPTER.blur(rev99, 403, 9));
-        assertEquals(rev11_9, RestrictionType.NONE.blur(rev99, 403, 9));
+        assertEquals(gen11_1.getOsisRef(), RestrictionType.CHAPTER.blur(gen11, 0, 0).getOsisRef());
+        assertEquals(gen11_1.getOsisRef(), RestrictionType.NONE.blur(gen11, 0, 0).getOsisRef());
+        assertEquals(gen11_2.getOsisRef(), RestrictionType.CHAPTER.blur(gen11, 0, 1).getOsisRef());
+        assertEquals(gen11_2.getOsisRef(), RestrictionType.NONE.blur(gen11, 0, 1).getOsisRef());
+        assertEquals(gen11_1.getOsisRef(), RestrictionType.CHAPTER.blur(gen11, 1, 0).getOsisRef());
+        assertEquals(gen11_1.getOsisRef(), RestrictionType.NONE.blur(gen11, 0, 0).getOsisRef());
+        assertEquals(gen11_1.getOsisRef(), RestrictionType.CHAPTER.blur(gen11, 9, 0).getOsisRef());
+        assertEquals(gen11_1.getOsisRef(), RestrictionType.NONE.blur(gen11, 0, 0).getOsisRef());
+        assertEquals(rev99_1.getOsisRef(), RestrictionType.CHAPTER.blur(rev99, 0, 1).getOsisRef());
+        assertEquals(rev99_1.getOsisRef(), RestrictionType.NONE.blur(rev99, 0, 1).getOsisRef());
+        assertEquals(rev99_1.getOsisRef(), RestrictionType.CHAPTER.blur(rev99, 0, 9).getOsisRef());
+        assertEquals(rev99_1.getOsisRef(), RestrictionType.NONE.blur(rev99, 0, 9).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.NONE.blur(gen11, 0, 30).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11, 0, 30).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.NONE.blur(gen11, 1, 30).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11, 1, 30).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.NONE.blur(gen11, 0, 30).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11, 9, 30).getOsisRef());
+        assertEquals(gen11_a.getOsisRef(), RestrictionType.NONE.blur(gen11, 0, 32).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11, 0, 32).getOsisRef());
+        assertEquals(gen11_a.getOsisRef(), RestrictionType.NONE.blur(gen11, 1, 32).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11, 1, 32).getOsisRef());
+        assertEquals(gen11_a.getOsisRef(), RestrictionType.NONE.blur(gen11, 0, 32).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11, 9, 32).getOsisRef());
+        assertEquals(gen_all.getOsisRef(), RestrictionType.NONE.blur(gen11, 0, 1581).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11, 0, 1581).getOsisRef());
+        assertEquals(gen_all.getOsisRef(), RestrictionType.NONE.blur(gen11, 1, 1581).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11, 1, 1581).getOsisRef());
+        assertEquals(gen_all.getOsisRef(), RestrictionType.NONE.blur(gen11, 0, 1581).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11, 9, 1581).getOsisRef());
+        assertEquals(gen_ex1.getOsisRef(), RestrictionType.NONE.blur(gen11, 0, 1584).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11, 0, 1533).getOsisRef());
+        assertEquals(gen_ex1.getOsisRef(), RestrictionType.NONE.blur(gen11, 1, 1584).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11, 1, 1584).getOsisRef());
+        assertEquals(gen_ex1.getOsisRef(), RestrictionType.NONE.blur(gen11, 0, 1584).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11, 9, 1584).getOsisRef());
+        assertEquals(gen_rev.getOsisRef(), RestrictionType.NONE.blur(gen11, 0, 32356).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11, 0, 32356).getOsisRef());
+        assertEquals(gen_rev.getOsisRef(), RestrictionType.NONE.blur(gen11, 1, 32356).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11, 1, 32356).getOsisRef());
+        assertEquals(gen_rev.getOsisRef(), RestrictionType.NONE.blur(gen11, 0, 32356).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11, 9, 32356).getOsisRef());
+        assertEquals(gen_rev.getOsisRef(), RestrictionType.NONE.blur(gen11, 0, 32357).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11, 0, 32357).getOsisRef());
+        assertEquals(gen_rev.getOsisRef(), RestrictionType.NONE.blur(gen11, 1, 32357).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11, 1, 32357).getOsisRef());
+        assertEquals(gen_rev.getOsisRef(), RestrictionType.NONE.blur(gen11, 0, 32357).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11, 9, 32357).getOsisRef());
+        assertEquals(gen_rev.getOsisRef(), RestrictionType.NONE.blur(gen11, 0, 99999).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11, 0, 99999).getOsisRef());
+        assertEquals(gen_rev.getOsisRef(), RestrictionType.NONE.blur(gen11, 1, 99999).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11, 1, 99999).getOsisRef());
+        assertEquals(gen_rev.getOsisRef(), RestrictionType.NONE.blur(gen11, 0, 99999).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11, 9, 99999).getOsisRef());
+        assertEquals(gen11_2.getOsisRef(), RestrictionType.CHAPTER.blur(gen12, 1, 0).getOsisRef());
+        assertEquals(gen11_2.getOsisRef(), RestrictionType.NONE.blur(gen12, 1, 0).getOsisRef());
+        assertEquals(gen11_2.getOsisRef(), RestrictionType.CHAPTER.blur(gen12, 9, 0).getOsisRef());
+        assertEquals(gen11_2.getOsisRef(), RestrictionType.NONE.blur(gen12, 1, 0).getOsisRef());
+        assertEquals(rev99_9.getOsisRef(), RestrictionType.CHAPTER.blur(rev99, 20, 0).getOsisRef());
+        assertEquals(rev99_9.getOsisRef(), RestrictionType.NONE.blur(rev99, 20, 0).getOsisRef());
+        assertEquals(rev99_9.getOsisRef(), RestrictionType.CHAPTER.blur(rev99, 20, 1).getOsisRef());
+        assertEquals(rev99_9.getOsisRef(), RestrictionType.NONE.blur(rev99, 20, 1).getOsisRef());
+        assertEquals(rev99_9.getOsisRef(), RestrictionType.CHAPTER.blur(rev99, 20, 9).getOsisRef());
+        assertEquals(rev99_9.getOsisRef(), RestrictionType.NONE.blur(rev99, 20, 9).getOsisRef());
+        assertEquals(rev99_9.getOsisRef(), RestrictionType.CHAPTER.blur(rev99, 425, 0).getOsisRef());
+        assertEquals(rev11_9.getOsisRef(), RestrictionType.NONE.blur(rev99, 425, 0).getOsisRef());
+        assertEquals(rev99_9.getOsisRef(), RestrictionType.CHAPTER.blur(rev99, 425, 1).getOsisRef());
+        assertEquals(rev11_9.getOsisRef(), RestrictionType.NONE.blur(rev99, 425, 1).getOsisRef());
+        assertEquals(rev99_9.getOsisRef(), RestrictionType.CHAPTER.blur(rev99, 425, 9).getOsisRef());
+        assertEquals(rev11_9.getOsisRef(), RestrictionType.NONE.blur(rev99, 425, 9).getOsisRef());
     }
 
     public void testNewViaVerseRangeIntIntBoolean() {
-        assertEquals(gen11_1, RestrictionType.CHAPTER.blur(gen11_1, 0, 0));
-        assertEquals(gen11_1, RestrictionType.NONE.blur(gen11_1, 0, 0));
-        assertEquals(gen11_2, RestrictionType.CHAPTER.blur(gen11_1, 0, 1));
-        assertEquals(gen11_2, RestrictionType.NONE.blur(gen11_1, 0, 1));
-        assertEquals(gen11_1, RestrictionType.CHAPTER.blur(gen11_1, 1, 0));
-        assertEquals(gen11_1, RestrictionType.NONE.blur(gen11_1, 1, 0));
-        assertEquals(gen11_1, RestrictionType.CHAPTER.blur(gen11_1, 9, 0));
-        assertEquals(gen11_1, RestrictionType.NONE.blur(gen11_1, 9, 0));
-        assertEquals(rev99_1, RestrictionType.CHAPTER.blur(rev99_1, 0, 1));
-        assertEquals(rev99_1, RestrictionType.NONE.blur(rev99_1, 0, 1));
-        assertEquals(rev99_1, RestrictionType.CHAPTER.blur(rev99_1, 0, 9));
-        assertEquals(rev99_1, RestrictionType.NONE.blur(rev99_1, 0, 9));
-        assertEquals(gen11_9, RestrictionType.NONE.blur(gen11_1, 0, 30));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11_1, 0, 30));
-        assertEquals(gen11_9, RestrictionType.NONE.blur(gen11_1, 1, 30));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11_1, 1, 30));
-        assertEquals(gen11_9, RestrictionType.NONE.blur(gen11_1, 9, 30));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11_1, 9, 30));
-        assertEquals(gen11_a, RestrictionType.NONE.blur(gen11_1, 0, 31));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11_1, 0, 31));
-        assertEquals(gen11_a, RestrictionType.NONE.blur(gen11_1, 1, 31));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11_1, 1, 31));
-        assertEquals(gen11_a, RestrictionType.NONE.blur(gen11_1, 9, 31));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11_1, 9, 31));
-        assertEquals(gen_all, RestrictionType.NONE.blur(gen11_1, 0, 1532));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11_1, 0, 1532));
-        assertEquals(gen_all, RestrictionType.NONE.blur(gen11_1, 1, 1532));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11_1, 1, 1532));
-        assertEquals(gen_all, RestrictionType.NONE.blur(gen11_1, 9, 1532));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11_1, 9, 1532));
-        assertEquals(gen_ex1, RestrictionType.NONE.blur(gen11_1, 0, 1533));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11_1, 0, 1533));
-        assertEquals(gen_ex1, RestrictionType.NONE.blur(gen11_1, 1, 1533));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11_1, 1, 1533));
-        assertEquals(gen_ex1, RestrictionType.NONE.blur(gen11_1, 9, 1533));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11_1, 9, 1533));
-        assertEquals(gen_rev, RestrictionType.NONE.blur(gen11_1, 0, 31101));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11_1, 0, 31101));
-        assertEquals(gen_rev, RestrictionType.NONE.blur(gen11_1, 1, 31101));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11_1, 1, 31101));
-        assertEquals(gen_rev, RestrictionType.NONE.blur(gen11_1, 9, 31101));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11_1, 9, 31101));
-        assertEquals(gen_rev, RestrictionType.NONE.blur(gen11_1, 0, 31102));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11_1, 0, 31102));
-        assertEquals(gen_rev, RestrictionType.NONE.blur(gen11_1, 1, 31102));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11_1, 1, 31102));
-        assertEquals(gen_rev, RestrictionType.NONE.blur(gen11_1, 9, 31102));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11_1, 9, 31102));
-        assertEquals(gen_rev, RestrictionType.NONE.blur(gen11_1, 0, 99999));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11_1, 0, 99999));
-        assertEquals(gen_rev, RestrictionType.NONE.blur(gen11_1, 1, 99999));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11_1, 1, 99999));
-        assertEquals(gen_rev, RestrictionType.NONE.blur(gen11_1, 9, 99999));
-        assertEquals(gen11_9, RestrictionType.CHAPTER.blur(gen11_1, 9, 99999));
-        assertEquals(gen11_2, RestrictionType.CHAPTER.blur(gen12_1, 1, 0));
-        assertEquals(gen11_2, RestrictionType.NONE.blur(gen12_1, 1, 0));
-        assertEquals(gen11_2, RestrictionType.CHAPTER.blur(gen12_1, 9, 0));
-        assertEquals(gen11_2, RestrictionType.NONE.blur(gen12_1, 9, 0));
-        assertEquals(rev99_9, RestrictionType.CHAPTER.blur(rev99_1, 20, 0));
-        assertEquals(rev99_9, RestrictionType.NONE.blur(rev99_1, 20, 0));
-        assertEquals(rev99_9, RestrictionType.CHAPTER.blur(rev99_1, 20, 1));
-        assertEquals(rev99_9, RestrictionType.NONE.blur(rev99_1, 20, 1));
-        assertEquals(rev99_9, RestrictionType.CHAPTER.blur(rev99_1, 20, 9));
-        assertEquals(rev99_9, RestrictionType.NONE.blur(rev99_1, 20, 9));
-        assertEquals(rev99_9, RestrictionType.CHAPTER.blur(rev99_1, 403, 0));
-        assertEquals(rev11_9, RestrictionType.NONE.blur(rev99_1, 403, 0));
-        assertEquals(rev99_9, RestrictionType.CHAPTER.blur(rev99_1, 403, 1));
-        assertEquals(rev11_9, RestrictionType.NONE.blur(rev99_1, 403, 1));
-        assertEquals(rev99_9, RestrictionType.CHAPTER.blur(rev99_1, 403, 9));
-        assertEquals(rev11_9, RestrictionType.NONE.blur(rev99_1, 403, 9));
+        assertEquals(gen11_1.getOsisRef(), RestrictionType.CHAPTER.blur(gen11_1, 0, 0).getOsisRef());
+        assertEquals(gen11_1.getOsisRef(), RestrictionType.NONE.blur(gen11_1, 0, 0).getOsisRef());
+        assertEquals(gen11_2.getOsisRef(), RestrictionType.CHAPTER.blur(gen11_1, 0, 1).getOsisRef());
+        assertEquals(gen11_2.getOsisRef(), RestrictionType.NONE.blur(gen11_1, 0, 1).getOsisRef());
+        assertEquals(gen11_1.getOsisRef(), RestrictionType.CHAPTER.blur(gen11_1, 1, 0).getOsisRef());
+        assertEquals(gen11_1.getOsisRef(), RestrictionType.NONE.blur(gen11_1, 1, 0).getOsisRef());
+        assertEquals(gen11_1.getOsisRef(), RestrictionType.CHAPTER.blur(gen11_1, 9, 0).getOsisRef());
+        assertEquals(gen11_1.getOsisRef(), RestrictionType.NONE.blur(gen11_1, 9, 0).getOsisRef());
+        assertEquals(rev99_1.getOsisRef(), RestrictionType.CHAPTER.blur(rev99_1, 0, 1).getOsisRef());
+        assertEquals(rev99_1.getOsisRef(), RestrictionType.NONE.blur(rev99_1, 0, 1).getOsisRef());
+        assertEquals(rev99_1.getOsisRef(), RestrictionType.CHAPTER.blur(rev99_1, 0, 9).getOsisRef());
+        assertEquals(rev99_1.getOsisRef(), RestrictionType.NONE.blur(rev99_1, 0, 9).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.NONE.blur(gen11_1, 0, 30).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11_1, 0, 30).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.NONE.blur(gen11_1, 1, 30).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11_1, 1, 30).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.NONE.blur(gen11_1, 9, 30).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11_1, 9, 30).getOsisRef());
+        assertEquals(gen11_a.getOsisRef(), RestrictionType.NONE.blur(gen11_1, 0, 31).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11_1, 0, 31).getOsisRef());
+        assertEquals(gen11_a.getOsisRef(), RestrictionType.NONE.blur(gen11_1, 1, 31).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11_1, 1, 31).getOsisRef());
+        assertEquals(gen11_a.getOsisRef(), RestrictionType.NONE.blur(gen11_1, 9, 31).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11_1, 9, 31).getOsisRef());
+        assertEquals(gen_all.getOsisRef(), RestrictionType.NONE.blur(gen11_1, 0, 1581).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11_1, 0, 1581).getOsisRef());
+        assertEquals(gen_all.getOsisRef(), RestrictionType.NONE.blur(gen11_1, 1, 1581).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11_1, 1, 1581).getOsisRef());
+        assertEquals(gen_all.getOsisRef(), RestrictionType.NONE.blur(gen11_1, 9, 1581).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11_1, 9, 1581).getOsisRef());
+        assertEquals(gen_ex1.getOsisRef(), RestrictionType.NONE.blur(gen11_1, 0, 1584).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11_1, 0, 1584).getOsisRef());
+        assertEquals(gen_ex1.getOsisRef(), RestrictionType.NONE.blur(gen11_1, 1, 1584).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11_1, 1, 1584).getOsisRef());
+        assertEquals(gen_ex1.getOsisRef(), RestrictionType.NONE.blur(gen11_1, 9, 1584).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11_1, 9, 1584).getOsisRef());
+        assertEquals(gen_rev.getOsisRef(), RestrictionType.NONE.blur(gen11_1, 0, 32356).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11_1, 0, 32356).getOsisRef());
+        assertEquals(gen_rev.getOsisRef(), RestrictionType.NONE.blur(gen11_1, 1, 32356).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11_1, 1, 32356).getOsisRef());
+        assertEquals(gen_rev.getOsisRef(), RestrictionType.NONE.blur(gen11_1, 9, 32356).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11_1, 9, 32356).getOsisRef());
+        assertEquals(gen_rev.getOsisRef(), RestrictionType.NONE.blur(gen11_1, 0, 32357).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11_1, 0, 32357).getOsisRef());
+        assertEquals(gen_rev.getOsisRef(), RestrictionType.NONE.blur(gen11_1, 1, 32357).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11_1, 1, 32357).getOsisRef());
+        assertEquals(gen_rev.getOsisRef(), RestrictionType.NONE.blur(gen11_1, 9, 32357).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11_1, 9, 32357).getOsisRef());
+        assertEquals(gen_rev.getOsisRef(), RestrictionType.NONE.blur(gen11_1, 0, 99999).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11_1, 0, 99999).getOsisRef());
+        assertEquals(gen_rev.getOsisRef(), RestrictionType.NONE.blur(gen11_1, 1, 99999).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11_1, 1, 99999).getOsisRef());
+        assertEquals(gen_rev.getOsisRef(), RestrictionType.NONE.blur(gen11_1, 9, 99999).getOsisRef());
+        assertEquals(gen11_9.getOsisRef(), RestrictionType.CHAPTER.blur(gen11_1, 9, 99999).getOsisRef());
+        assertEquals(gen11_2.getOsisRef(), RestrictionType.CHAPTER.blur(gen12_1, 1, 0).getOsisRef());
+        assertEquals(gen11_2.getOsisRef(), RestrictionType.NONE.blur(gen12_1, 1, 0).getOsisRef());
+        assertEquals(gen11_2.getOsisRef(), RestrictionType.CHAPTER.blur(gen12_1, 9, 0).getOsisRef());
+        assertEquals(gen11_2.getOsisRef(), RestrictionType.NONE.blur(gen12_1, 9, 0).getOsisRef());
+        assertEquals(rev99_9.getOsisRef(), RestrictionType.CHAPTER.blur(rev99_1, 20, 0).getOsisRef());
+        assertEquals(rev99_9.getOsisRef(), RestrictionType.NONE.blur(rev99_1, 20, 0).getOsisRef());
+        assertEquals(rev99_9.getOsisRef(), RestrictionType.CHAPTER.blur(rev99_1, 20, 1).getOsisRef());
+        assertEquals(rev99_9.getOsisRef(), RestrictionType.NONE.blur(rev99_1, 20, 1).getOsisRef());
+        assertEquals(rev99_9.getOsisRef(), RestrictionType.CHAPTER.blur(rev99_1, 20, 9).getOsisRef());
+        assertEquals(rev99_9.getOsisRef(), RestrictionType.NONE.blur(rev99_1, 20, 9).getOsisRef());
+        assertEquals(rev99_9.getOsisRef(), RestrictionType.CHAPTER.blur(rev99_1, 425, 0).getOsisRef());
+        assertEquals(rev11_9.getOsisRef(), RestrictionType.NONE.blur(rev99_1, 425, 0).getOsisRef());
+        assertEquals(rev99_9.getOsisRef(), RestrictionType.CHAPTER.blur(rev99_1, 425, 1).getOsisRef());
+        assertEquals(rev11_9.getOsisRef(), RestrictionType.NONE.blur(rev99_1, 425, 1).getOsisRef());
+        assertEquals(rev99_9.getOsisRef(), RestrictionType.CHAPTER.blur(rev99_1, 425, 9).getOsisRef());
+        assertEquals(rev11_9.getOsisRef(), RestrictionType.NONE.blur(rev99_1, 425, 9).getOsisRef());
     }
 
     public void testNewViaVerseRangeVerseRange() {
@@ -450,13 +450,13 @@
         assertEquals(gen11_1.getCardinality(), 1);
         assertEquals(gen11_2.getCardinality(), 2);
         assertEquals(gen11_9.getCardinality(), 31);
-        assertEquals(gen11_a.getCardinality(), 32);
+        assertEquals(gen11_a.getCardinality(), 33);
         assertEquals(gen12_1.getCardinality(), 1);
-        assertEquals(gen_all.getCardinality(), 1533);
-        assertEquals(gen_ex1.getCardinality(), 1534);
-        assertEquals(gen_rev.getCardinality(), 31102);
+        assertEquals(gen_all.getCardinality(), 1582);
+        assertEquals(gen_ex1.getCardinality(), 1585);
+        assertEquals(gen_rev.getCardinality(), 32356);
         assertEquals(rev99_9.getCardinality(), 21);
-        assertEquals(rev11_9.getCardinality(), 404);
+        assertEquals(rev11_9.getCardinality(), 425);
         assertEquals(rev99_1.getCardinality(), 1);
     }
 
@@ -604,18 +604,18 @@
         assertEquals(gen12_1.toVerseArray()[0], gen12);
         assertEquals(gen_all.toVerseArray()[0], gen11);
         assertEquals(gen_ex1.toVerseArray()[0], gen11);
-        assertEquals(gen_ex1.toVerseArray()[1533], exo11);
+        assertEquals(gen_ex1.toVerseArray()[1584], exo11);
         assertEquals(rev11_9.toVerseArray()[0], rev11);
         assertEquals(rev11_9.toVerseArray()[1], rev12);
-        assertEquals(rev11_9.toVerseArray()[403], rev99);
+        assertEquals(rev11_9.toVerseArray()[424], rev99);
         assertEquals(gen11_1.toVerseArray().length, 1);
         assertEquals(gen11_2.toVerseArray().length, 2);
         assertEquals(gen11_9.toVerseArray().length, 31);
-        assertEquals(gen11_a.toVerseArray().length, 32);
+        assertEquals(gen11_a.toVerseArray().length, 33);
         assertEquals(gen12_1.toVerseArray().length, 1);
-        assertEquals(gen_all.toVerseArray().length, 1533);
-        assertEquals(gen_ex1.toVerseArray().length, 1534);
-        assertEquals(rev11_9.toVerseArray().length, 404);
+        assertEquals(gen_all.toVerseArray().length, 1582);
+        assertEquals(gen_ex1.toVerseArray().length, 1585);
+        assertEquals(rev11_9.toVerseArray().length, 425);
     }
 
     public void testVerseElements() {

Copied: trunk/jsword/src/test/java/org/crosswire/jsword/versification/BibleInfoTest.java (from rev 2201, trunk/jsword/src/test/java/org/crosswire/jsword/passage/BibleInfoTest.java)
===================================================================
--- trunk/jsword/src/test/java/org/crosswire/jsword/versification/BibleInfoTest.java	                        (rev 0)
+++ trunk/jsword/src/test/java/org/crosswire/jsword/versification/BibleInfoTest.java	2012-01-14 14:10:44 UTC (rev 2210)
@@ -0,0 +1,339 @@
+/**
+ * Distribution License:
+ * JSword is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License, version 2.1 as published by
+ * the Free Software Foundation. This program is distributed in the hope
+ * that it will be useful, but WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU Lesser General Public License for more details.
+ *
+ * The License is available on the internet at:
+ *       http://www.gnu.org/copyleft/lgpl.html
+ * or by writing to:
+ *      Free Software Foundation, Inc.
+ *      59 Temple Place - Suite 330
+ *      Boston, MA 02111-1307, USA
+ *
+ * Copyright: 2005
+ *     The copyright to this program is held by it's authors.
+ *
+ * ID: $Id$
+ */
+package org.crosswire.jsword.versification;
+
+import java.util.EnumSet;
+
+import junit.framework.TestCase;
+
+import org.crosswire.jsword.book.CaseType;
+import org.crosswire.jsword.passage.NoSuchVerseException;
+import org.crosswire.jsword.passage.Verse;
+import org.crosswire.jsword.versification.BibleBook;
+import org.crosswire.jsword.versification.BibleInfo;
+import org.crosswire.jsword.versification.BookName;
+
+/**
+ * JUnit Test.
+ * 
+ * @see gnu.lgpl.License for license details.<br>
+ *      The copyright to this program is held by it's authors.
+ * @author Joe Walker [joe at eireneh dot com]
+ */
+public class BibleInfoTest extends TestCase {
+    public BibleInfoTest(String s) {
+        super(s);
+    }
+
+    private CaseType storedCase;
+
+    @Override
+    protected void setUp() {
+        storedCase = BookName.getDefaultCase();
+    }
+
+    @Override
+    protected void tearDown() {
+        BookName.setCase(storedCase);
+    }
+
+    public void testCase() {
+        BookName.setCase(CaseType.LOWER);
+        assertEquals(CaseType.LOWER, BookName.getDefaultCase());
+
+        BookName.setCase(CaseType.UPPER);
+        assertEquals(CaseType.UPPER, BookName.getDefaultCase());
+
+        BookName.setCase(CaseType.SENTENCE);
+        assertEquals(CaseType.SENTENCE, BookName.getDefaultCase());
+    }
+
+    public void testGetLongBookName() throws Exception {
+        BookName.setCase(CaseType.SENTENCE);
+        assertEquals("Genesis", BibleBook.GEN.getLongName());
+        assertEquals("Revelation of John", BibleBook.REV.getLongName());
+
+        BookName.setCase(CaseType.LOWER);
+        assertEquals("genesis", BibleBook.GEN.getLongName());
+        assertEquals("revelation of john", BibleBook.REV.getLongName());
+
+        BookName.setCase(CaseType.UPPER);
+        assertEquals("GENESIS", BibleBook.GEN.getLongName());
+        assertEquals("REVELATION OF JOHN", BibleBook.REV.getLongName());
+
+    }
+
+    public void testGetShortBookName() throws Exception {
+        BookName.setCase(CaseType.SENTENCE);
+        assertEquals("Gen", BibleBook.GEN.getShortName());
+        assertEquals("Exo", BibleBook.EXOD.getShortName());
+        assertEquals("Judg", BibleBook.JUDG.getShortName());
+        assertEquals("Mal", BibleBook.MAL.getShortName());
+        assertEquals("Mat", BibleBook.MATT.getShortName());
+        assertEquals("Phili", BibleBook.PHIL.getShortName());
+        assertEquals("Phile", BibleBook.PHLM.getShortName());
+        assertEquals("Jude", BibleBook.JUDE.getShortName());
+        assertEquals("Rev", BibleBook.REV.getShortName());
+
+        BookName.setCase(CaseType.LOWER);
+        assertEquals("gen", BibleBook.GEN.getShortName());
+        assertEquals("exo", BibleBook.EXOD.getShortName());
+        assertEquals("judg", BibleBook.JUDG.getShortName());
+        assertEquals("mal", BibleBook.MAL.getShortName());
+        assertEquals("mat", BibleBook.MATT.getShortName());
+        assertEquals("phili", BibleBook.PHIL.getShortName());
+        assertEquals("phile", BibleBook.PHLM.getShortName());
+        assertEquals("jude", BibleBook.JUDE.getShortName());
+        assertEquals("rev", BibleBook.REV.getShortName());
+
+        BookName.setCase(CaseType.UPPER);
+        assertEquals("GEN", BibleBook.GEN.getShortName());
+        assertEquals("EXO", BibleBook.EXOD.getShortName());
+        assertEquals("JUDG", BibleBook.JUDG.getShortName());
+        assertEquals("MAL", BibleBook.MAL.getShortName());
+        assertEquals("MAT", BibleBook.MATT.getShortName());
+        assertEquals("PHILI", BibleBook.PHIL.getShortName());
+        assertEquals("PHILE", BibleBook.PHLM.getShortName());
+        assertEquals("JUDE", BibleBook.JUDE.getShortName());
+        assertEquals("REV", BibleBook.REV.getShortName());
+    }
+
+    public void testGetBookJogger() throws Exception {
+        assertEquals("Gen", BibleBook.GEN.getOSIS());
+        assertEquals("Exod", BibleBook.EXOD.getOSIS());
+        assertEquals("Rev", BibleBook.REV.getOSIS());
+    }
+
+    public void testGetBookNumber() {
+        assertEquals(BibleBook.GEN, BibleBook.getBook("Genesis"));
+        assertEquals(BibleBook.GEN, BibleBook.getBook("Gene"));
+        assertEquals(BibleBook.GEN, BibleBook.getBook("Gen"));
+        assertEquals(BibleBook.GEN, BibleBook.getBook("G"));
+        assertEquals(BibleBook.GEN, BibleBook.getBook("g"));
+        assertEquals(BibleBook.GEN, BibleBook.getBook("GEN"));
+        assertEquals(BibleBook.GEN, BibleBook.getBook("genesis"));
+        assertEquals(BibleBook.PS, BibleBook.getBook("psa"));
+        assertEquals(BibleBook.PS, BibleBook.getBook("ps"));
+        assertEquals(BibleBook.PS, BibleBook.getBook("pss"));
+        assertEquals(BibleBook.PS, BibleBook.getBook("psalter"));
+        assertEquals(BibleBook.ECCL, BibleBook.getBook("ecc"));
+        assertEquals(BibleBook.ECCL, BibleBook.getBook("Qohelot"));
+        assertEquals(BibleBook.SONG, BibleBook.getBook("son"));
+        assertEquals(BibleBook.SONG, BibleBook.getBook("song"));
+        assertEquals(BibleBook.SONG, BibleBook.getBook("song of solomon"));
+        assertEquals(BibleBook.SONG, BibleBook.getBook("songofsolomon"));
+        assertEquals(BibleBook.SONG, BibleBook.getBook("ss"));
+        assertEquals(BibleBook.SONG, BibleBook.getBook("canticle"));
+        assertEquals(BibleBook.SONG, BibleBook.getBook("can"));
+        assertEquals(BibleBook.PHIL, BibleBook.getBook("phi"));
+        assertEquals(BibleBook.PHIL, BibleBook.getBook("phil"));
+        assertEquals(BibleBook.PHIL, BibleBook.getBook("phili"));
+        assertEquals(BibleBook.PHLM, BibleBook.getBook("phile"));
+        assertEquals(BibleBook.REV, BibleBook.getBook("revelations"));
+        assertEquals(BibleBook.REV, BibleBook.getBook("rev"));
+
+        assertEquals(null, BibleBook.getBook("1"));
+    }
+
+    public void testIn() throws Exception {
+        // Counts using loops
+        int viw_c = 0;
+        int ciw = 0;
+
+        // For all the books
+        // for (BibleBook b : BibleBook.values()) {
+        for (BibleBook b: EnumSet.range(BibleBook.INTRO_BIBLE, BibleBook.REV)) {
+
+            // Continue the verse counts for the whole Bible
+            for (int c = 0; c <= BibleInfo.chaptersInBook(b); c++) {
+                viw_c += BibleInfo.versesInChapter(b, c) + 1;
+            }
+
+            // Continue the chapter count for the whole Bible
+            ciw += BibleInfo.chaptersInBook(b);
+        }
+
+        assertEquals(BibleInfo.maximumOrdinal() + 1, viw_c);
+        assertEquals(BibleInfo.chaptersInBible(), ciw);
+        assertEquals(BibleInfo.booksInBible(), 69);
+    }
+
+    public void testOrdinal() throws Exception {
+        int first_verse_ord = 1;
+        int last_verse_ord = 1;
+        // for (BibleBook b : BibleBook.values()) {
+        for (BibleBook b: EnumSet.range(BibleBook.GEN, BibleBook.MAL)) {
+            for (int c = 0; c <= BibleInfo.chaptersInBook(b); c++) {
+                first_verse_ord++; // chapter introduction
+                last_verse_ord = first_verse_ord + BibleInfo.versesInChapter(b, c);
+
+                Verse bc0 = new Verse(b, c, 0);
+                assertEquals(bc0.getName(), first_verse_ord, BibleInfo.getOrdinal(bc0));
+                assertEquals(bc0.getName(), bc0, BibleInfo.decodeOrdinal(first_verse_ord));
+
+                if (c > 0) {
+                    Verse bc1 = new Verse(b, c, 1);
+                    assertEquals(bc1.getName(), first_verse_ord + 1, BibleInfo.getOrdinal(bc1));
+                    assertEquals(bc1.getName(), bc1, BibleInfo.decodeOrdinal(first_verse_ord + 1));
+
+                    Verse bc2 = new Verse(b, c, 2);
+                    assertEquals(bc2.getName(), first_verse_ord + 2, BibleInfo.getOrdinal(bc2));
+                    assertEquals(bc2.getName(), bc2, BibleInfo.decodeOrdinal(first_verse_ord + 2));
+
+                    Verse bclast = new Verse(b, c, BibleInfo.versesInChapter(b, c));
+                    assertEquals(bclast.getName(), last_verse_ord, BibleInfo.getOrdinal(bclast));
+//                    assertEquals(bclast.getName(), bclast, BibleInfo.decodeOrdinal(last_verse_ord));
+                }
+                first_verse_ord += BibleInfo.versesInChapter(b, c);
+            }
+        }
+        first_verse_ord++; // NT Introduction
+        for (BibleBook b: EnumSet.range(BibleBook.MATT, BibleBook.REV)) {
+            first_verse_ord++; // book introduction
+            for (int c = 1; c <= BibleInfo.chaptersInBook(b); c++) {
+                first_verse_ord++; // chapter introduction
+                last_verse_ord = first_verse_ord + BibleInfo.versesInChapter(b, c);
+
+                assertEquals(first_verse_ord, BibleInfo.getOrdinal(new Verse(b, c, 0)));
+                assertEquals(first_verse_ord + 1, BibleInfo.getOrdinal(new Verse(b, c, 1)));
+                assertEquals(first_verse_ord + 2, BibleInfo.getOrdinal(new Verse(b, c, 2)));
+                assertEquals(last_verse_ord, BibleInfo.getOrdinal(new Verse(b, c, BibleInfo.versesInChapter(b, c))));
+
+                assertEquals(new Verse(b, c, 0), BibleInfo.decodeOrdinal(first_verse_ord));
+                assertEquals(new Verse(b, c, 1), BibleInfo.decodeOrdinal(first_verse_ord + 1));
+                assertEquals(new Verse(b, c, 2), BibleInfo.decodeOrdinal(first_verse_ord + 2));
+                assertEquals(new Verse(b, c, BibleInfo.versesInChapter(b, c)), BibleInfo.decodeOrdinal(last_verse_ord));
+
+                first_verse_ord += BibleInfo.versesInChapter(b, c);
+            }
+        }
+    }
+
+    public void testValidate() throws Exception {
+        // for (BibleBook b : BibleBook.values()) {
+        for (BibleBook b: EnumSet.range(BibleBook.GEN, BibleBook.REV)) {
+            try {
+                BibleInfo.validate(b, 0, 1);
+                fail();
+            } catch (NoSuchVerseException ex) {
+            }
+            if (b != BibleBook.INTRO_NT) {
+                BibleInfo.validate(b, 1, 0);
+            }
+
+            for (int c = 0; c <= BibleInfo.chaptersInBook(b); c++) {
+                BibleInfo.validate(b, c, 0);
+
+                for (int v = 0; v <= BibleInfo.versesInChapter(b, c); v++) {
+                    BibleInfo.validate(b, c, v);
+                }
+                try {
+                    BibleInfo.validate(b, c, BibleInfo.versesInChapter(b, c) + 1);
+                    fail();
+                } catch (NoSuchVerseException ex) {
+                }
+            }
+        }
+    }
+
+    public void testPatch() throws Exception {
+        int all = 1;
+        // for (BibleBook b : BibleBook.values()) {
+        for (BibleBook b: EnumSet.range(BibleBook.GEN, BibleBook.MAL)) {
+            int cib = BibleInfo.chaptersInBook(b);
+            for (int c = 1; c <= cib; c++) {
+                int vic = BibleInfo.versesInChapter(b, c);
+                for (int v = 1; v <= vic; v++) {
+                    Verse pv = BibleInfo.patch(BibleBook.GEN, 1, all);
+
+                    assertEquals(pv.getName(), b, pv.getBook());
+                    assertEquals(pv.getName(), c, pv.getChapter());
+                    assertEquals(pv.getName(), v, pv.getVerse());
+                    all++;
+                }
+            }
+        }
+        all = 1;
+        for (BibleBook b: EnumSet.range(BibleBook.MATT, BibleBook.REV)) {
+            int cib = BibleInfo.chaptersInBook(b);
+            for (int c = 1; c <= cib; c++) {
+                int vic = BibleInfo.versesInChapter(b, c);
+                for (int v = 1; v <= vic; v++) {
+                    Verse pv = BibleInfo.patch(BibleBook.MATT, 1, all);
+
+                    assertEquals(pv.getName(), b, pv.getBook());
+                    assertEquals(pv.getName(), c, pv.getChapter());
+                    assertEquals(pv.getName(), v, pv.getVerse());
+                    all++;
+                }
+            }
+        }
+        Verse gen11 = new Verse(BibleBook.GEN, 1, 1);
+        assertEquals(gen11, BibleInfo.patch(BibleBook.GEN, 1, 1));
+//        assertEquals(gen11, BibleInfo.patch(BibleBook.GEN, 1, 0));
+        assertEquals(gen11, BibleInfo.patch(BibleBook.GEN, 0, 1));
+//        assertEquals(gen11, BibleInfo.patch(BibleBook.GEN, 0, 0));
+        assertEquals(gen11, BibleInfo.patch(null, 1, 1));
+//        assertEquals(gen11, BibleInfo.patch(null, 1, 0));
+        assertEquals(gen11, BibleInfo.patch(null, 0, 1));
+//        assertEquals(gen11, BibleInfo.patch(null, 0, 0));
+    }
+
+    public void testVerseCount() throws Exception {
+        int count_up = 0;
+        Verse gen00 = new Verse(BibleBook.GEN, 0, 0);
+        Verse gen110 = new Verse(BibleBook.GEN, 1, 10);
+        Verse rev99 = new Verse(BibleBook.REV, 22, 21);
+        // for (BibleBook b : BibleBook.values()) {
+        for (BibleBook b: EnumSet.range(BibleBook.GEN, BibleBook.REV)) {
+            for (int c = 0; c <= BibleInfo.chaptersInBook(b); c++) {
+                for (int v = 0; v <= BibleInfo.versesInChapter(b, c); v++) {
+                    Verse curVerse = new Verse(b, c, v);
+                    int up = curVerse.subtract(gen00) + 1;
+                    assertEquals(++count_up, up);
+//                    assertEquals(verseCountSlow(gen00, curVerse), up);
+                }
+            }
+
+        }
+        int count_down = BibleInfo.maximumOrdinal();
+        assertEquals(rev99.getOrdinal(), count_down);
+        count_down -= 2; // Subtract for the Module and OT intros
+        for (BibleBook b: EnumSet.range(BibleBook.GEN, BibleBook.REV)) {
+            for (int c = 0; c <= BibleInfo.chaptersInBook(b); c++) {
+                for (int v = 0; v <= BibleInfo.versesInChapter(b, c); v++) {
+                    Verse curVerse = new Verse(b, c, v);
+                    int down = rev99.subtract(curVerse);
+                    assertEquals(count_down--, down);
+                }
+            }
+
+        }
+        assertEquals(11, gen110.subtract(gen00));
+    }
+
+    public void testNames() {
+        assertEquals(2, BibleBook.GEN.ordinal());
+        assertEquals(68, BibleBook.REV.ordinal());
+    }
+
+}




More information about the jsword-svn mailing list