My submission
' LB Help File Searcher
' Janet Terra
' May 1, 2011
'
' This code is free for personal use.
' You may not republish this code in its current form.
' You may modify this code for your personal use.
' You may publish a modified version of this code under these conditions:
'    1. You have made major changes to the code.
'    2. You give credit to the original authors
'
' Credit for this program goes to members of the Liberty BASIC
' community, most especially Alyce Watson and Stefan Pendl.
' Snippets absorbed and regurgitated by Janet Terra
' Note re: page navigators (previous and next)
'   Only pages selected by the listbox are stored
'   The navigation buttons have no effect on redisplaying
'       pages hyperlinked to within the html pages themselves
'
 
' Get the path to the Html Help Files and Images - Thanks to Stefan Pendl
    LBModulePath$ = GetModuleFileName$() ' Path to liberty44.exe
    LBHelpPath$ = GetLBPath$(LBModulePath$);"lb4help\LibertyBASIC_4_web\html\" ' Path to Html Help Files
    LBHelpIndex$ = LBHelpPath$;"libe3mnn.htm" ' The LB Index file
 
' Fill an array with command references
    dim cmd$(8)
    cmd$(1) = "Commands A - C";chr$(0);LBHelpPath$;"LIBE2CO3.HTM"
    cmd$(2) = "Commands D - F";chr$(0);LBHelpPath$;"LIBE2M5I.HTM"
    cmd$(3) = "Commands G - K";chr$(0);LBHelpPath$;"LIBE2VMZ.HTM"
    cmd$(4) = "Commands L - M";chr$(0);LBHelpPath$;"LIBE3BFX.HTM"
    cmd$(5) = "Commands N - P";chr$(0);LBHelpPath$;"LIBE3HRK.HTM"
    cmd$(6) = "Commands R - S";chr$(0);LBHelpPath$;"LIBE3UER.HTM"
    cmd$(7) = "Commands T - Z";chr$(0);LBHelpPath$;"LIBE40QF.HTM"
    cmd$(8) = "Index";chr$(0);LBHelpPath$;"libe3mnn.HTM"
 
' Define a struct to hold window dimensions - Thanks to Bill Beasley
    struct rcClient, _
        xLeft as long, _
        yUpper as long, _
        xRight as long, _
        yLower as long
 
' Define a string to hold the viewed pages
    pageIndex$ = ""
    viewPage = 1
 
' The GUI
    WindowWidth = 800
    WindowHeight = 600
    UpperLeftX = int((DisplayWidth - WindowWidth) / 2)
    UpperLeftY = int((DisplayHeight - WindowHeight) / 2)
 
    stylebits #main.cmd, 0, _WS_BORDER, 0, 0
    graphicbox #main.cmd, 590, 40, 180, 100
    stylebits #main.prev, _BS_BITMAP or _WS_THICKFRAME, 0, 0, 0
    button #main.prev, "", [prevPage], UL, 650, 144, 32, 32
    stylebits #main.next, _BS_BITMAP or _WS_THICKFRAME, 0, 0, 0
    button #main.next, "", [nextPage], UL, 690, 144, 32, 32
    textbox #main.srch, 600, 180, 150, 30
    stylebits #main.go, _BS_DEFPUSHBUTTON or _BS_BITMAP or _WS_THICKFRAME, 0, 0, 0
    button #main.go, "", [search], UL, 750, 180, 30, 30
    listbox #main.mtch, matchFiles$(), [DisplayHtml], 600, 220, 180, 330
    graphicbox #main.atl, 20, 20, 565, 530
    open "Search LB Help HTML Files" for window_nf as #main
 
' Draw and save the prev button image
    #main.atl "down"
    restore [dataNavImage]
    for y = 1 to 30
        for x = 1 to 30
            read pixelLong
            r = GetRed(pixelLong)
            g = GetGrn(pixelLong)
            b = GetBlue(pixelLong)
            #main.atl "color ";r;" ";g;" ";b
            #main.atl "set ";x;" ";y
        next x
    next y
    #main.atl "flush"
    #main.atl "getbmp bttnPrev 1 1 30 30"
    hButton1 = hwnd(#main.prev)
    hBitmap1 = hbmp("bttnPrev")
    call SendMessageA hButton1, _BM_SETIMAGE, _IMAGE_BITMAP, hBitmap1
 
    restore [dataNavImage]
    for y = 1 to 30
        for x = 30 to 1 step -1
            read pixelLong
            r = GetRed(pixelLong)
            g = GetGrn(pixelLong)
            b = GetBlue(pixelLong)
            #main.atl "color ";r;" ";g;" ";b
            #main.atl "set ";x;" ";y
        next x
    next y
    #main.atl "flush"
    #main.atl "getbmp bttnNext 1 1 30 30"
    hButton2 = hwnd(#main.next)
    hBitmap2 = hbmp("bttnNext")
    call SendMessageA hButton2, _BM_SETIMAGE, _IMAGE_BITMAP, hBitmap2
 
' Draw and save the search button image
    restore [dataSearchImage]
    for y = 1 to 30
        for x = 1 to 30
            read pixelLong
            r = GetRed(pixelLong)
            g = GetGrn(pixelLong)
            b = GetBlue(pixelLong)
            #main.atl "color ";r;" ";g;" ";b
            #main.atl "set ";x;" ";y
        next x
    next y
    #main.atl "flush"
    #main.atl "getbmp bttnSearch 1 1 30 30"
 
    hButton3 = hwnd(#main.go)
    hBitmap3 = hbmp("bttnSearch")
    call SendMessageA hButton3, _BM_SETIMAGE, _IMAGE_BITMAP, hBitmap3
 
' Relocate controls
    call GetClientRect hwnd(#main)
    xMain = rcClient.xLeft.struct
    wMain = rcClient.xRight.struct
    yMain = rcClient.yUpper.struct
    tMain = rcClient.yLower.struct
    #main.atl "locate 10 10 565 ";tMain - 30
    #main.cmd "locate ";wMain - 210;" 40 190 100"
    #main.cmd "down; backcolor buttonface"
    call CommandReferences
    #main.cmd "flush"
    #main.prev "!locate ";wMain - 150;" 140 32 32"
    #main.next "!locate ";wMain - 110;" 140 32 32"
    #main.srch "!locate ";wMain - 210;" 180 160 30"
    #main.go "!locate ";wMain - 50;" 179 32 32"
    #main.mtch "locate ";wMain - 210;" 220 190 ";tMain - 240
    #main "font verdana 10"
    #main "refresh"
    #main.mtch "singleclickselect"
    #main "trapclose [quit]"
    #main.cmd "when mouseMove [htmlCursor]"
    #main.cmd "when leftButtonUp [DisplayAlphCommands]"
    #main.prev "!disable"
    #main.next "!disable"
    #main.atl "cls"
 
' Convert graphicbox to browser display using ATL dll - Thanks to Alyce Watson and Stefan Pendl
    hMain = hwnd(#main)
    hBrowserContainer = hwnd(#main.atl)
    open "atl" for dll as #atl
    calldll #atl, "AtlAxWinInit", _
        ATLinitialized as long
    styleATL = _WS_CHILD or _WS_VISIBLE or _WS_VSCROLL or _WS_HSCROLL
    calldll #user32, "GetWindowLongA", _
        hMain as ulong, _
        _GWL_HINSTANCE as long, _
        hInst as ulong
    hATL = CreateWindowExA(LBHelpIndex$, styleATL, hBrowserContainer, hInst)
    htmlFile$ = LBHelpIndex$
 
' pageIndex$ holds the first displayed page
    pageIndex$ = LBHelpIndex$
 
' Disable search textbox while html files being read
    #main.srch "!Disable"
 
' Use files() command to find number of Html Help Files
    dim info$(10, 10)
    files LBHelpPath$, info$()
    nHtmlFiles = val(info$(0, 0)) ' Total number of LB Html Help Files
 
' Searchbox phrases
    lp$ = "Loading . . . "
    LoadingPhrase$ = ""
    for i = 1 to nHtmlFiles / 15
        LoadingPhrase$ = LoadingPhrase$;lp$
    next i
    sp$ = "Searching . . . "
    SearchingPhrase$ = ""
    for i = 1 to nHtmlFiles / 15
        SearchingPhrase$ = SearchingPhrase$;sp$
    next i
 
' Store the file names in an array
    dim htmlFiles$(nHtmlFiles)
    for i = 1 to nHtmlFiles
        htmlFiles$(i) = info$(i, 0)
    next i
 
' Store contents of each file in htmlFiles$()
    for i = 1 to nHtmlFiles
        html$ = LBHelpPath$;htmlFiles$(i)
        open html$ for input as #1
            contents$ = input$(#1, LOF(#1))
            htmlFiles$(i) = htmlFiles$(i);chr$(0);contents$
        close #1
    next i
 
' Store the title of each file in htmlFiles$()
    n = 0
    for i = 1 to nHtmlFiles
        n = n + 1
        if n mod 25 = 0 then
            #main.srch right$(LoadingPhrase$, n)
        end if
        htmlTitle$ = ExtractHtmlTitle$(htmlFiles$(i))
        htmlFiles$(i) = htmlTitle$;chr$(0);htmlFiles$(i)
    next i
 
' htmlFiles$() format
'   htmlTitle$;chr$(0);htmlFilePath$;chr$(0);htmlContents$
 
' Alphabetize by title
    sort htmlFiles$(), 1, nHtmlFiles
 
' Define an array to hold html files containing search item
    dim matchFiles$(nHtmlFiles)
    for i = 1 to nHtmlFiles
        matchFiles$(i) = htmlFiles$(i)
    next i
 
' Load the match listbox
    #main.mtch "reload"
 
' Enable search textbox
    #main.srch "Search for ..."
    #main.srch "!enable"
 
' Load pointing hand cursor - Thanks to Gordon Sweet
    hCmd = hwnd(#main.cmd)
    call SetClass hCmd
    nCursor = 32649
    hCursor = LoadCursor(nCursor)
wait
 
[DisplayAlphCommands]
    if cmd <> 0 then
        if word$(cmd$(cmd), 2, chr$(0)) <> htmlFile$ then
            pageIndex$ = pageIndex$;chr$(0);word$(cmd$(cmd), 2, chr$(0))
            viewPage = vPages(pageIndex$)
            if viewPage > 1 then
                #main.prev "!enable"
            end if
            #main.next "!disable"
        end if
        htmlFile$ = word$(cmd$(cmd), 2, chr$(0))
        call DestroyWindow hATL
        hATL = CreateWindowExA(htmlFile$, styleATL, hBrowserContainer, hInst)
    end if
wait
 
[DisplayHtml]
    #main.mtch "selectionindex? nPage"
    p$ = LBHelpPath$;word$(matchFiles$(nPage), 2, chr$(0))
    if htmlFile$ <> p$ then
        pageIndex$ = pageIndex$;chr$(0);p$
        viewPage = vPages(pageIndex$)
        if viewPage = 1 then
            #main.prev "!disable"
        else
            #main.prev "!enable"
        end if
    end if
    #main.next "!disable"
    htmlFile$ = LBHelpPath$;word$(matchFiles$(nPage), 2, chr$(0))
    call DestroyWindow hATL
    hATL = CreateWindowExA(htmlFile$, styleATL, hBrowserContainer, hInst)
wait
 
[search]
    #main.srch "!contents? search$"
    nSearchFiles = FindMatch(nHtmlFiles, search$)
    #main.mtch "reload"
wait
 
[prevPage]
    viewPage = max(viewPage - 1, 1)
    if viewPage = 1 then
        #main.prev "!disable"
    else
        #main.prev "!enable"
    end if
    if viewPage = nPages then
        #main.next "!disable"
    else
        #main.next "!enable"
    end if
    htmlFile$ = word$(pageIndex$, viewPage, chr$(0))
    call DestroyWindow hATL
    hATL = CreateWindowExA(htmlFile$, styleATL, hBrowserContainer, hInst)
wait
 
[nextPage]
    viewPage = min(viewPage + 1, vPages(pageIndex$))
    if viewPage = 1 then
        #main.prev "!disable"
    else
        #main.prev "!enable"
    end if
    if viewPage = vPages(pageIndex$) then
        #main.next "!disable"
    else
        #main.next "!enable"
    end if
    htmlFile$ = word$(pageIndex$, viewPage, chr$(0))
    call DestroyWindow hATL
    hATL = CreateWindowExA(htmlFile$, styleATL, hBrowserContainer, hInst)
wait
 
[htmlCursor]
    xVar = MouseX
    yVar = MouseY
    cmd = 0
    select case
        case yVar > 28 and yVar < 42
            select case
                case xVar > 37 and xVar < 63
                    cmd = 1
                case xVar > 77 and xVar < 103
                    cmd = 2
                case xVar > 117 and xVar < 143
                    cmd = 3
            end select
        case yVar > 50 and yVar < 64
            select case
                case xVar > 10 and xVar < 36
                    cmd = 4
                case xVar > 55 and xVar < 83
                    cmd = 5
                case xVar > 100 and xVar < 126
                    cmd = 6
                case xVar > 144 and xVar < 170
                    cmd = 7
            end select
        case yVar > 72 and yVar < 86
            if xVar > 30 then
                if xVar < 150 then
                    cmd = 8
                end if
            end if
    end select
    if cmd = 0 then
        nCursor = 0
        cursor normal
    else
        nCursor = 32649
        call SetCursor hCursor
    end if
wait
 
[quit]
    call DestroyWindow hATL
    close #atl
    close #main
end
 
[dataNavImage]
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16776957, 16710390, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777210, 16639938, 16634800, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16707785, 15255703, 16439987, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16773061, 15848875, 14466454, 16440230, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16774352, 16176041, 15320731, 14859919, 16506789, 16777215, 16777215, 16777214, 16777215, 16777214, 16777214, 16776958, 16776958, 16776958, 16776957, 16776958, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16711677, 16643288, 16112558, 15714456, 15650453, 15123850, 16242589, 16640456, 16507838, 16309432, 16375738, 15914930, 15848624, 15650730, 15452837, 15452319, 15318677, 16181207, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16709846, 15982517, 15585443, 16109972, 15453583, 15584140, 15582085, 15449984, 15252092, 15185785, 14725746, 14264423, 14395237, 14197084, 13998418, 14063179, 13862966, 15586229, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16776665, 16246460, 15914665, 16243102, 15847824, 15321746, 15648650, 16239234, 15384189, 15186809, 14988401, 14724459, 14855271, 14722397, 14656087, 14589261, 14653766, 14191148, 15783091, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16776416, 16377276, 16046511, 16243625, 16045723, 15650193, 15846293, 16041867, 15712379, 15515001, 15513973, 15316078, 15184491, 14853983, 14918747, 14852437, 14785869, 14456130, 13993515, 15717556, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777214, 16776414, 16575182, 16441023, 16506801, 16374699, 16177058, 16044186, 15845264, 15909768, 15843968, 15711861, 15448687, 15316587, 15117923, 14985565, 14984536, 14720849, 14589259, 14127938, 13666349, 15652277, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777212, 16776155, 16643027, 16573386, 16769725, 16637874, 16439980, 16045219, 15847319, 16041613, 15778693, 15515516, 15514994, 15317354, 15185254, 15052637, 15051609, 14853458, 14720845, 14260293, 13996863, 13535791, 15586741, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777208, 16776389, 16444365, 16377544, 16048310, 16441267, 16439723, 16045214, 15912847, 16172677, 15778943, 15056250, 15514995, 15185258, 14987876, 15117661, 15051096, 14721873, 14589512, 14522181, 14324541, 13863724, 15717812, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777207, 16774860, 16049606, 15984064, 16113069, 16242340, 16241049, 16174985, 15845500, 15712889, 15252597, 15382386, 15053418, 15117927, 14920029, 14918997, 14917712, 14785351, 14653761, 14521406, 14190893, 15848884, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16776943, 16643285, 15850934, 15980968, 15848864, 16044181, 16304775, 15714169, 15581814, 15448435, 15512429, 15314791, 15117154, 15050842, 15049556, 14786125, 14654280, 14587973, 14521152, 14190639, 15848629, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16776951, 16773051, 16046763, 15323289, 15584912, 15910534, 15712633, 15646069, 15513712, 15774567, 15380063, 15248218, 14985043, 14984272, 14655047, 14523204, 14457154, 14325054, 13928238, 15717813, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16776434, 16508085, 15585435, 15386763, 15778686, 16039544, 15579762, 15185255, 14789212, 14592086, 14525777, 14131274, 14064454, 13932611, 13997375, 13865788, 13667897, 13205547, 15454644, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16776950, 16639158, 15779207, 15645556, 15645297, 15119207, 15909492, 15583622, 15516288, 15186551, 15186293, 14856305, 14986349, 14854502, 14591837, 14328155, 13799760, 15652544, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16710382, 16703653, 15187583, 14792047, 14330727, 16437385, 16777211, 16775402, 16774376, 16775146, 16774376, 16708326, 16708068, 16576483, 16510688, 16313053, 16578547, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16776691, 16307341, 14793335, 13542245, 16305549, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16775656, 16109194, 13672806, 16303493, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16776173, 15845003, 16369545, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16773599, 16238215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16641241, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
 
[dataSearchImage]
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 15066596, 14211029, 14934495, 15263460, 15197924, 16052979, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16447992, 13618632, 11381666, 11117464, 10918800, 10787213, 10655627, 12235180, 16645114, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16382457, 11116956, 11314074, 11116692, 12101269, 14601397, 15851463, 16180429, 12167317, 12498608, 16052979, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 8156784, 10129542, 11838094, 13876903, 16771789, 16573124, 16506813, 16770242, 15852221, 7891028, 11709863, 16251128, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 9868434, 6973024, 11575952, 14467485, 16441526, 16308656, 16440498, 16506036, 16440757, 16375729, 11376490, 8879981, 13684688, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 13026757, 5393478, 10721929, 14074009, 16571295, 15978635, 15913089, 15782012, 15979137, 16308879, 16773035, 15521934, 9207134, 10722711, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 9144968, 6247755, 12035467, 15849626, 16439431, 16109942, 16373101, 16175715, 15978853, 15649893, 16113021, 16773014, 9863772, 9537913, 16711674, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 8750975, 7102806, 12429961, 16311446, 16376706, 16507519, 16638581, 16768880, 16769131, 16571751, 16113248, 16379248, 9536334, 9800323, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 8948098, 6840406, 12167820, 16510366, 16509836, 16443526, 16574847, 16770938, 16705397, 16639341, 16772455, 14406470, 8025404, 10195606, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 10790047, 6247764, 11050118, 16511654, 16708249, 16576147, 16576138, 16576643, 16576124, 16708217, 16575852, 12234052, 8091219, 12039605, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 14211286, 5129286, 10392707, 15395235, 16775851, 16774046, 16643730, 16578442, 16709766, 16578172, 16380790, 10256723, 8945270, 15462376, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 8949381, 6775383, 12366737, 16776637, 16776874, 16710814, 16775332, 16710554, 16777098, 14410626, 9208190, 12959422, 16776959, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16447995, 7037780, 8945510, 13684127, 16382387, 16777140, 16644529, 16316576, 15397010, 12169871, 11577003, 16119028, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 11842486, 9077112, 9143926, 11841687, 13027216, 13224337, 12630678, 11840407, 11578017, 16250617, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 14805743, 9879266, 9088463, 11252147, 14934493, 12302008, 9735563, 10064010, 10393487, 11907247, 14935008, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16250872, 8960215, 6600430, 2711184, 15726329, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 14147047, 5670836, 3111097, 11884, 16777212, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 15068144, 4025756, 7455735, 2977184, 10728392, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16579839, 3561595, 6863600, 6402539, 7246259, 16776700, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 9676215, 6794466, 7259130, 15997, 10792897, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 12047076, 6797037, 543879, 1326697, 14014688, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 15200245, 12441065, 10334401, 12963029, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
data 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
 
function GetRed(longInt)
    GetRed = longInt And 255
end function
 
function GetGrn(longInt)
    GetGrn = (longInt And 65280)/256
end function
 
function GetBlue(longInt)
    GetBlue = (longInt And 16711680)/65536
end function
 
function FindMatch(nFiles, search$)
    ct = 0
    redim matchFiles$(nFiles)
    for ii = 1 to nFiles
        contents$ = word$(htmlFiles$(ii), 1, chr$(0));word$(htmlFiles$(ii), 3, chr$(0))
        if instr(upper$(contents$), upper$(search$)) > 0 then
            ct = ct + 1
            matchFiles$(ct) = htmlFiles$(ii)
        end if
    next ii
    FindMatch = ct
end function
 
function GetModuleFileName$()
    nSize = _MAX_PATH + 1
    lpFilename$ = space$(nSize); CHR$(0)
 
    calldll #kernel32, "GetModuleFileNameA", _
        hModule as ulong, _
        lpFilename$ as ptr, _
        nSize as ulong, _
        result as ulong
 
    if result > 0 then
        GetModuleFileName$ = trim$(lpFilename$)
    end if
end function
 
function GetLBPath$(LBModulePath$)
    pos = 0
    for ii = len(LBModulePath$) to 1 step -1
        if mid$(LBModulePath$, ii, 1) = "\" then
            pos = ii
            exit for
        end if
    next ii
    GetLBPath$ = left$(LBModulePath$, pos)
end function
 
function ExtractHtmlTitle$(contents$)
    c1a$ = ""
    c1b$ = ""
    c2$ = ""
    tag1a$ = "<A NAME=";chr$(34)
    tag1b$ = chr$(34);"></A><B>"
    tag2$ = "</B></P>"
    pos1a = 0
    pos1b = 0
    pos2 = 0
    if instr(upper$(contents$), tag1a$) > 0 then
        pos1a = instr(upper$(contents$), tag1a$) + len(tag1a$) + 1
        c1a$ = mid$(contents$, pos1a)
    end if
    if instr(upper$(c1a$), tag1b$) > 0 then
        pos1b = instr(upper$(c1a$), tag1b$) + len(tag1b$)
        c1b$ = mid$(c1a$, pos1b)
    end if
    if instr(upper$(c1b$), tag2$) > 0 then
        pos2 = instr(upper$(c1b$), tag2$) - 1
        ExtractHtmlTitle$ = trim$(left$(c1b$, pos2))
    end if
    if ExtractHtmlTitle$ <> "" then
        exit function
    end if
    tag1$ = "<P><B>"
    tag2$ = "</B></P>"
    pos1 = instr(upper$(contents$), tag1$) + len(tag1$)
    c1$ = mid$(contents$, pos1)
    pos2 = instr(upper$(c1$), tag2$)
    ExtractHtmlTitle$ = left$(c1$, pos2 - 1)
end function
 
sub SendMessageA hControl, param1, param2, param3
    calldll #user32, "SendMessageA", _
        hControl as ulong, _
        param1 as long, _
        param2 as long, _
        param3 as long, _
        result as long
end sub
 
sub GetClientRect hControl
    calldll #user32, "GetClientRect", _
        hControl as ulong, _
        rcClient as struct, _
        result as long
end sub
 
function CreateWindowExA(page$, style, hParent, hInst)
    call GetClientRect hwnd(#main)
    wATL = rcClient.xRight.struct - 230
    tMain = rcClient.yLower.struct - 30
    calldll #user32, "CreateWindowExA", _
        _WS_EX_CLIENTEDGE as ulong, _
        "ATLAxWin" as ptr, _
        page$ as ptr, _
        style as ulong, _
        0 as long, _
        0 as long, _
        wATL as long, _
        tMain as long, _
        hParent as ulong, _
        _NULL as ulong, _
        hInst as ulong, _
        _NULL as ulong, _
        CreateWindowExA as ulong
end function
 
sub SetClass hControl
    index = _GCL_HCURSOR or 0
    calldll #user32, "SetClassLongA", _
        hControl as ulong, _
        index as long, _
        0 as long, _
        result as long
end sub
 
sub SetCursor hCursor
    calldll #user32, "SetCursor", _
        hCursor as ulong, _
        result as long
end sub
 
function LoadCursor(nCursor)
    flags = hexdec("8000") or _LR_DEFAULTSIZE
    calldll #user32, "LoadImageA", _
        0 as long, _
        nCursor as long, _
        _IMAGE_CURSOR as long, _
        0 as long, _
        0 as long, _
        flags as long, _
        hCursor as uLong
    call SetCursor hCursor
    LoadCursor = hCursor
end function
 
sub DestroyWindow hATL
    calldll #user32, "DestroyWindow", _
        hATL as ulong, _
        result as long
end sub
 
sub CommandReferences
    #main.cmd "place -10 -10; boxfilled 210 110"
    #main.cmd "font verdana 10 bold; color black"
    t$ = "LB Command References"
    #main.cmd "stringwidth? t$ wdth"
    #main.cmd "place ";int(90 - wdth / 2);" 16"
    #main.cmd "\";t$
    #main.cmd "font verdana 10 underscore; color blue"
    t$ = "A-C"
    #main.cmd "stringwidth? t$ wdth"
    #main.cmd "place ";int(50 - wdth / 2);" 40"
    #main.cmd "\";t$
    t$ = "D-F"
    #main.cmd "stringwidth? t$ wdth"
    #main.cmd "place ";int(90 - wdth / 2);" 40"
    #main.cmd "\";t$
    t$ = "G-K"
    #main.cmd "stringwidth? t$ wdth"
    #main.cmd "place ";int(130 - wdth / 2);" 40"
    #main.cmd "\";t$
    t$ = "L-M"
    #main.cmd "stringwidth? t$ wdth"
    #main.cmd "place ";int(23 - wdth / 2);" 62"
    #main.cmd "\";t$
    t$ = "N-P"
    #main.cmd "stringwidth? t$ wdth"
    #main.cmd "place ";int(68 - wdth / 2);" 62"
    #main.cmd "\";t$
    t$ = "R-S"
    #main.cmd "stringwidth? t$ wdth"
    #main.cmd "place ";int(113 - wdth / 2);" 62"
    #main.cmd "\";t$
    t$ = "T-Z"
    #main.cmd "stringwidth? t$ wdth"
    #main.cmd "place ";int(157 - wdth / 2);" 62"
    #main.cmd "\";t$
    t$ = "Quick Start Guide"
    #main.cmd "stringwidth? t$ wdth"
    #main.cmd "place ";int(90 - wdth / 2);" 86"
    #main.cmd "\";t$
    #main.cmd "flush"
end sub
 
function vPages(pageIndex$)
    vPages = 1
    pageIndex$ = trim$(pageIndex$)
    while instr(pageIndex$, chr$(0)) > 0
        vPages = vPages + 1
        if instr(pageIndex$, chr$(0)) > 0 then
            pos = instr(pageIndex$, chr$(0)) + 1
            pageIndex$ = mid$(pageIndex$, pos)
        end if
    wend
end function

It is likely that improvements will be made to this code before the contest deadline.

May 3, 2011 - Images for bitmap buttons created 'on the fly' rather than loading bmp files