#help_index "God"
U0 BibleInit()
{
  DefineLstLoad("ST_BIBLE_BOOKS",
        "Genesis\0"
        "Exodus\0"
        "Leviticus\0"
        "Numbers\0"
        "Deuteronomy\0"
        "Joshua\0"
        "Judges\0"
        "Ruth\0"
        "1 Samuel\0"
        "2 Samuel\0"
        "1 Kings\0"
        "2 Kings\0"
        "1 Chronicles\0"
        "2 Chronicles\0"
        "Ezra\0"
        "Nehemiah\0"
        "Esther\0"
        "Job\0"
        "Psalms\0"
        "Proverbs\0"
        "Ecclesiastes\0"
        "Song of Songs\0"
        "Isaiah\0"
        "Jeremiah\0"
        "Lamentations\0"
        "Ezekiel\0"
        "Daniel\0"
        "Hosea\0"
        "Joel\0"
        "Amos\0"
        "Obadiah\0"
        "Jonah\0"
        "Micah\0"
        "Nahum\0"
        "Habakkuk\0"
        "Zephaniah\0"
        "Haggai\0"
        "Zechariah\0"
        "Malachi\0"
        "Matthew\0"
        "Mark\0"
        "Luke\0"
        "John\0"
        "Acts\0"
        "Romans\0"
        "1 Corinthians\0"
        "2 Corinthians\0"
        "Galatians\0"
        "Ephesians\0"
        "Philippians\0"
        "Colossians\0"
        "1 Thessalonians\0"
        "2 Thessalonians\0"
        "1 Timothy\0"
        "2 Timothy\0"
        "Titus\0"
        "Philemon\0"
        "Hebrews\0"
        "James\0"
        "1 Peter\0"
        "2 Peter\0"
        "1 John\0"
        "2 John\0"
        "3 John\0"
        "Jude\0"
        "Revelation\0");
  DefineLstLoad("ST_BIBLE_BOOK_LINES",
        "297\0"
        "5068\0"
        "9123\0"
        "12005\0"
        "15977\0"
        "19168\0"
        "21329\0"
        "23598\0"
        "23902\0"
        "26892\0"
        "29345\0"
        "32241\0"
        "34961\0"
        "37633\0"
        "40756\0"
        "41671\0"
        "42963\0"
        "43605\0"
        "46190\0"
        "53793\0"
        "56267\0"
        "56966\0"
        "57332\0"
        "61806\0"
        "66736\0"
        "67217\0"
        "71804\0"
        "73189\0"
        "73876\0"
        "74130\0"
        "74615\0"
        "74697\0"
        "74860\0"
        "75241\0"
        "75416\0"
        "75604\0"
        "75806\0"
        "75932\0"
        "76684\0"
        "76908\0"
        "79970\0"
        "81941\0"
        "85266\0"
        "87803\0"
        "90914\0"
        "92110\0"
        "93323\0"
        "94088\0"
        "94514\0"
        "94869\0"
        "95153\0"
        "95402\0"
        "95647\0"
        "95772\0"
        "96090\0"
        "96320\0"
        "96440\0"
        "96500\0"
        "97370\0"
        "97687\0"
        "97976\0"
        "98163\0"
        "98506\0"
        "98552\0"
        "98597\0"
        "98684\0"
        "100111\0");
  DefinePrint("ST_BIBLE_LINES","%d",
        Str2I64(DefineSub(DefineCnt("ST_BIBLE_BOOK_LINES")-1,
        "ST_BIBLE_BOOK_LINES"))-1);
} BibleInit;

public U8 *BibleLine2Verse(I64 line,I64 separate_ch=CH_SPACE)
{//Line number to verse str, Malloc()ed.
//Separate with <SPACE> or ','.  If you pass '%', it uses "%20".
  CDoc *doc;
  CDocEntry *doc_e;
  I64 i=0,cnt=DefineCnt("ST_BIBLE_BOOKS"),start=0,last_start=0;
  U8 *ptr=DefineSub(0,"ST_BIBLE_BOOK_LINES"),*ptr2;
  while (i<=cnt) {
    last_start=start;
    start=Str2I64(ptr);
    if (line<start)
      break;
    i++;
    ptr+=StrLen(ptr)+1;
  }
  if (0<=--i<cnt) {
    doc=DocRead(BIBLE_FILENAME,DOCF_PLAIN_TEXT|DOCF_NO_CURSOR);
    DocGoToLine(doc,line); //one based
    doc_e=doc->cur_entry;
    while (doc_e!=doc && (doc_e->type_u8!=DOCT_TEXT || !*doc_e->tag))
      doc_e=doc_e->next;
    if (doc_e->type_u8==DOCT_TEXT && '0'<=*doc_e->tag<='9') {
      ptr=ptr2=doc_e->tag;
      while ('0'<=*ptr2<='9' || *ptr2==':')
        ptr2++;
      *ptr2=0;
      if (separate_ch=='%')
        ptr=MStrPrint("%Z%%20%s",i,"ST_BIBLE_BOOKS",ptr);
      else
        ptr=MStrPrint("%Z%c%s",i,"ST_BIBLE_BOOKS",separate_ch,ptr);
    } else {
      while (TRUE) {
        doc_e=doc_e->last;
        if (doc_e==doc) {
          ptr=NULL;
          break;
        }
        if (doc_e->y+1<last_start) {
          ptr=MStrPrint("%Z",i,"ST_BIBLE_BOOKS");
          break;
        }
        if (doc_e->type_u8==DOCT_TEXT && StrLen(doc_e->tag)>=3) {
          ptr=doc_e->tag+StrLen(doc_e->tag)-1;
          while (ptr>doc_e->tag && (!('0'<=*(ptr-1)<='9') || *ptr!=':' ||
                !('0'<=*(ptr+1)<='9')))
            ptr--;
          ptr--;
          while (ptr>=doc_e->tag && '0'<=*ptr<='9')
            ptr--;
          ptr2=++ptr;
          if ('0'<=*ptr2++<='9') {
            while ('0'<=*ptr2<='9')
              ptr2++;
            if (*ptr2++==':' && '0'<=*ptr2++<='9') {
              while ('0'<=*ptr2<='9')
                ptr2++;
              *ptr2=0;
              if (separate_ch=='%')
                ptr=MStrPrint("%Z%%20%s",i,"ST_BIBLE_BOOKS",ptr);
              else
                ptr=MStrPrint("%Z%c%s",i,"ST_BIBLE_BOOKS",separate_ch,ptr);
              break;
            }
          }
        }
      }
    }
    DocDel(doc);
    return ptr;
  } else
    return NULL;
}

public U0 BookLines(CDoc *doc_out=NULL,I64 start,I64 lines,
        U8 *book_filename=BIBLE_FILENAME)
{//Put N line starting at line M into doc.
  CDoc *doc_in;
  CDocEntry *doc_e;
  if (!doc_out) doc_out=DocPut;
  if (doc_out && FileFind(book_filename)) {
    doc_in=DocRead(book_filename,DOCF_PLAIN_TEXT|DOCF_NO_CURSOR);
    DocGoToLine(doc_in,start); //one based
    doc_e=doc_in->cur_entry;
    while (lines>0 && doc_e!=doc_in) {
      if (doc_e->type_u8==DOCT_TEXT)
        DocPrint(doc_out,"%s",doc_e->tag);
      else if (doc_e->type_u8==DOCT_NEW_LINE) {
        DocPutKey(doc_out,'\n');
        lines--;
      }
      doc_e=doc_e->next;
    }
    DocDel(doc_in);
  }
}

public U0 BibleVerse(CDoc *doc_out=NULL,U8 *verse,I64 lines)
{//Put N lines starting at verse str into doc.
  I64 i;
  CDoc *doc_in;
  CDocEntry *doc_e;
  U8 *st,*st2;
  if (!doc_out) doc_out=DocPut;
  if (doc_out && FileFind(BIBLE_FILENAME)) {
    st=StrNew(verse);
    st2=StrNew(verse);
    if (StrOcc(st,','))
      StrLastRem(st,",",st2);
    else
      *st2=0;
    i=DefineMatch(st,"ST_BIBLE_BOOKS",LMF_IGNORE_CASE);
    if (i>=0) {
      i=Str2I64(DefineSub(i,"ST_BIBLE_BOOK_LINES"));
      doc_in=DocRead(BIBLE_FILENAME,DOCF_PLAIN_TEXT|DOCF_NO_CURSOR);
      DocGoToLine(doc_in,i); //one based
      if (*st2) {
        StrCpy(doc_in->find_replace->find_text,st2);
        EdFindNext(doc_in);
      }
      doc_e=doc_in->cur_entry;
      while (lines>0 && doc_e!=doc_in) {
        if (doc_e->type_u8==DOCT_TEXT)
          DocPrint(doc_out,"%s",doc_e->tag);
        else if (doc_e->type_u8==DOCT_NEW_LINE) {
          DocPutKey(doc_out,'\n');
          lines--;
        }
        doc_e=doc_e->next;
      }
      DocDel(doc_in);
    }
    Free(st);
    Free(st2);
  }
}

public CDoc *BibleDoc()
{//Return Bible as DolDoc with trees.
  CDoc  *res=DocRead(BIBLE_FILENAME);
  CDocEntry *doc_e=res->head.next,*doc_e1;
  Bool open_chapter=FALSE;
  U8    *ptr=Define("ST_BIBLE_BOOK_LINES");
  I64   book,book_cnt=DefineCnt("ST_BIBLE_BOOK_LINES")-1,
        chapter,
        line=Str2I64(ptr,,&ptr);
  ptr++;
  for (book=0;book<book_cnt;book++) {
    while (doc_e->y+1<line) {
      doc_e1=doc_e->next;
      DocEntryDel(res,doc_e);
      doc_e=doc_e1;
    }
    res->cur_entry=doc_e;
    res->cur_col=0;
    DocPrint(res,"$TR,\"%Z\"$\n$ID,2$",book,"ST_BIBLE_BOOKS");
    line=Str2I64(ptr,,&ptr);
    ptr++;
    chapter=1;
    while (doc_e->y+1<line) {
      doc_e1=doc_e->next;
      if (doc_e->type_u8==DOCT_TEXT && StrMatch(":1 ",doc_e->tag)) {
        res->cur_entry=doc_e;
        res->cur_col=0;
        if (open_chapter) {
          DocPrint(res,"$ID,-2$");
          open_chapter=FALSE;
        }
        DocPrint(res,"$TR,\"%d\"$\n$ID,2$",chapter++);
        open_chapter=TRUE;
      } else if (chapter==1) {
        doc_e1=doc_e->next;
        DocEntryDel(res,doc_e);
        doc_e=doc_e1;
      }
      doc_e=doc_e1;
    }
    res->cur_entry=doc_e;
    res->cur_col=0;
    if (open_chapter) {
      DocPrint(res,"$ID,-2$");
      open_chapter=FALSE;
    }
    DocPrint(res,"$ID,-2$");
  }
  while (doc_e!=res) {
    doc_e1=doc_e->next;
    DocEntryDel(res,doc_e);
    doc_e=doc_e1;
  }
  return res;
}

public U0 BibleView()
{//View Bible as DolDoc with trees.
  U8 buf[STR_LEN];
  CDoc *doc=BibleDoc;
  StrPrint(buf,"AL:%d,1",doc);
  Ed(buf);
  DocDel(doc);
}
U0 CtrlAltB(I64)
{
  PopUp("BibleView;");
}
CtrlAltCBSet('B',&CtrlAltB,"Cmd /Bible");