/**/

main:

    qsl.0   = '-'   /* keine */
    qsl.1   = '>'   /* versprochen */
    qsl.2   = 'x'   /* abgeschickt/erhalten */

    calz.0  = ''
    calz.1  = '/m'
    calz.2  = '/p'
    calz.3  = '/mm'
    calz.4  = '/am'
    calz.5  = '/a'
    calz.!ANZ = 5

    guifile = 'gui/logbook.gui'

    path = pragma( 'd' )

    if exists("libs:rexxsupport.library") then do
        if ~show("L","rexxsupport.library") then
            if ~addlib("rexxsupport.library",0,-30,0) then exit
    end
    else exit

    if exists("libs:rexxreqtools.library") then do
        if ~show("L","rexxreqtools.library") then
            if ~addlib("rexxreqtools.library",0,-30) then exit
    end
    else exit

    if exists("libs:rexxtricks.library") then do
        if ~show("L","rexxtricks.library") then
            if ~addlib("rexxtricks.library",0,-30,0) then exit
    end
    else exit    

    options results
    options failat 20

    signal on syntax
    signal on failure 
    signal on halt

    call LoadPref

    /* Check Varexx is loaded if not load it */

    if show( 'p', 'VAREXX' ) ~= 1 then do

        address command "run >NIL: varexx:bin/varexx"
        address command "WaitForPort VAREXX"
        lchvr = TRUE

    end
    else
        lchvr = FALSE

    address VAREXX

    'version'

    if rc ~= 0 then do
        say 'This script requires varexx 1.3 or later'
        exit
    end

    if openport("LOGBOOK") = 0 then do

        if show( 'p', "LOGBOOK" ) ~= 1 then do

            call rtezrequest "Could not open a port.",, "Varexx Error"
            exit

        end

    end

    'load 'guifile "LOGBOOK"  pscr

    edithost = RESULT

    address value edithost

    ok = SetEnv("LOGHOST",edithost)

    'spawn LOGBOOK'

    listhost = RESULT

    call SetCycles

    LastQRG = -1

    'show' /* LOGBOOK'*/

    if windowpos_load = 'TRUE' then 
        call LoadWindow "LOGBOOK"
/*
    set label bprint disable
*/
    call SetPref

    setlabel "LOGBOOK" '"' || 'Logbuch der Station 'translate(MYCALL) || '"' window

    qrg.0 = 0

    call LoadLog
    call LoadQRG
    call ShowQRG LOGBOOK_INIT_BAND

    current = 0
    changed = 0

    filtert = 0

    lastData = ""

    do forever
        ok = waitpkt("LOGBOOK")
        packet = getpkt("LOGBOOK")
        IF packet ~= '00000000'x THEN DO

            class = GETARG(packet)
            elem = word(class,1)
            data = strip(substr(class,length(elem) + 1,length(class)))

            ok = reply(packet,0)

            select
                when elem = 'BENDE' | elem = 'CLOSEWINDOW' then do
                    if changed = 1 then do
                        ok = translate(rtezrequest('Logbuch speichern ?',' _Ja |_Nein'))
                        if ok = "JA" | ok = 1 then do
                            call SortList
                            call logsave
                            changed = 0
                        end
                    end
                    leave
                end
                when elem = 'BAUTOD' then call setdate
                when elem = 'ACTIVE' then do
                    'window front'
                end
                when elem = 'LOADQRG' then do
                    call LoadQrg
                end
                when elem = 'CBAND' then do
                    if data = "" then do
                        read label CBAND
                        data = result
                    end
                    data = data + 1
                    sqrg = band.data
                    call ShowQRG sqrg
                end
                when elem = 'BAUTOZB' then do
                    zeit = substr(time(),1,5)
                    zeit = utc(zeit)
                    settext label stimeb zeit
                end
                when elem = 'BINIT' then do
                    settext label stimee "--:--"
                end
                when elem = 'BAUTOZE' then do
                    zeit = substr(time(),1,5)
                    zeit = utc(zeit)
                    settext label stimee zeit
                end
                when elem = 'SCALL' then do
                    read label scall
                    call = result
                    p = pos('/',call)
                    if p > 0 then do
                        call = overlay("-",call,p)
                    end
                    p = pos('/',call)
                    if p = 0 then
                        settext label scall call
                    else do
                        settext label scall ""
                        call SetHint "Bei Calls nicht /p etc anhängen! Beispiel: dc1rs oder dl0dm-dc1rs"
                    end
                end
                when elem = 'BNEU' then do

                    if LOGBOOK_BNEUINIT = 'TRUE' then do
                        setnum label cband GetBand(LOGBOOK_INIT_BAND) - 1
                        setnum label cpower GetPower(LOGBOOK_INIT_POWER) - 1
                    end

                    setnum label czusatz 0

                    settext label stimee "--:--"
                    zeit = substr(time(),1,5)
                    zeit = utc(zeit)
                    settext label stimeb zeit
                    call setdate
                    settext label srem ""
/*
                    settext label sqrg ""
*/
                    settext label scall ""
                    setnum  label qslfrom 0
                    setnum  label qslto 0
                    setnum  label rstr 4
                    setnum  label rsts 0
                    setnum  label rstt 0
                    set label sdb disable
                    settext label sdb " "

                end
                when elem = 'BCLEAR' then do
/*
                    setnum label cband GetBand(LOGBOOK_INIT_BAND) - 1
                    setnum label cpower GetPower(LOGBOOK_INIT_POWER) - 1
*/

                    setnum label czusatz 0

                    settext label sdate ""
                    settext label stimee ""
                    settext label stimeb ""
                    settext label srem ""

                    settext label "sqrg" ""


                    settext label scall ""
                    setnum  label qslfrom 0
                    setnum  label qslto 0
                    setnum  label rstr 4
                    setnum  label rsts 0
                    setnum  label rstt 0
                    set label sdb disable
                    settext label sdb " "

                    setnum label cpower 0
                    setnum label cmode 0
                    setnum label cband 0

                end
                when elem = 'LVQRG' then do
                    f = word(data,2)
                    'settext label sqrg 'f
                    dup = word(data,1)
                    if dup = 'D' then
                        "setcheck label cbrel CHECK"
                    else
                        "setcheck label cbrel"
                end
                when elem = 'BINSERT' then do

                    call ReadMask
                    logs.COUNT = 0
                    call InsertLog
                    setlist label lvlog stem logs
                    cnt = logs.COUNT
                    sel = '"'logs.cnt'"'
                    setlist label lvlog select"="sel

                    changed = 1

                    if logbook_autosort = 'TRUE' then do
                        call AutoSort
                    end
                    if logbook_autosave = 'TRUE' then do
                        call LogSave
                        changed = 0
                    end
                end
                when elem = 'LVLOG' then do
                    lastData = data
                    call FillStrukt data
                    call WriteMask                   
                    read label CBAND
                    data = result                    
                    data = data + 1
                    sqrg = band.data
                    call ShowQRG sqrg
 
                end
                when elem = 'BSAVE' then do
/*
                    call SortList
*/
                    call logsave
                    changed = 0
                end
                when elem = 'BLOAD' then do
                    call loadlog
                end
                when elem = 'BDELETE' then do

                    call DeleteLog

                    changed = 1

                    if logbook_autosave = 'TRUE' then do
                        call LogSave
                        changed = 0
                    end

                end
                when elem = 'BEDIT' then do
                    busy set
                    call ReadMask
                    zeile = MakeLogLine()

                    read label lvlog var logs
    
                    qsonr = logs.SELECT

                    if qsonr > 0 then do
                        logs.qsonr = zeile
/*
                        setlist label lvlog select '"'zeile'"' UPDATE"="qsonr '"'zeile'"'
*/
                        setlist label lvlog stem logs update"="qsonr
                        changed = 1
                        if logbook_autosort = 'TRUE' then do
                            call AutoSort
                        end
                        if logbook_autosave = 'TRUE' then do
                            call LogSave
                            changed = 0
                        end
                    end
                    busy
                end
                when elem = 'BCALLSUCH' then do
                    read label scall
                    call = result
                    if call > "" then do
                        if pos("-",call) > 3 then do
                            p = pos("-",call)
                            c1 = substr(call,1,p - 1)
                            c2 = strip(substr(call,p + 1,length(call)))
                            shell command "run >nil: <nil: "REXXRUN" code/callinfo.rexx" c1 edithost listhost
                            shell command "run >nil: <nil: "REXXRUN" code/callinfo.rexx" c2 edithost listhost
                        end
                        else 
                            shell command "run >nil: <nil: "REXXRUN" code/callinfo.rexx" call edithost listhost
                    end
                    else
                        call SetHint "Bitte zuerst Call eingeben ..."
                end
                when elem = 'BKENN' then do
                    read label scall
                    call = result
                    if pos("-",call) > 3 then do
                        p = pos("-",call)
                        c1 = substr(call,1,p - 1)
                        c2 = strip(substr(call,p + 1,length(call)))
                        if show( 'p', "CALLKENN" ) ~= 1 then do
                            shell command "run >nil: <nil: "REXXRUN" code/callkenn.rexx" c1
                        end
                        else do
                            address 'CALLKENN' 'ACTIVE' call
                            address value edithost
                        end
                    end
                    else do
                        if show( 'p', "CALLKENN" ) ~= 1 then do
                            shell command "run >nil: <nil: "REXXRUN" code/callkenn.rexx" call
                        end
                        else do
                            address 'CALLKENN' 'ACTIVE' call
                            address value edithost
                        end
                    end
                end
                when elem = 'BMENU' then do
                    if show( 'p', "MENU" ) ~= 1 then do
                        shell command "run >nil: <nil: "REXXRUN" code/menu.rexx" call
                    end
                    else do
                        address 'MENU' 'ACTIVE' call
                        address value edithost
                    end
                end
                when elem = 'BBP' then do
                    
                    read label CBAND
                    bandnum = result                    
                    bandnum = bandnum + 1
                    sqrg = band.bandnum
                    if show( 'p', "HBANDPLAN" ) ~= 1 then do
                        shell command "run >nil: <nil: "REXXRUN" code/bandplan.rexx "sqrg
                    end
                    else do
                        address "HBANDPLAN" 'ACTIVE' sqrg
                        address value edithost
                    end
                end
                when elem = 'BGETCALL' then do
                    if show( 'p', "HGETCALL" ) ~= 1 then do
                        shell command "run >nil: <nil: "REXXRUN" code/getcall.rexx"
                    end
                    else do
                        address "HGETCALL" 'ACTIVE'
                        address value edithost
                    end
                end
                when elem = 'BSORT' then do
                    call SortList
                end
                when elem = 'RSTS' then do
                    read label rsts
                    s = result
                    if s = 9 then do
                        set label sdb enable
                        settext label sdb ""
                    end
                    else do
                        set label sdb disable
                        settext label sdb ""
                    end
                end
                when elem = 'CBAUTOSAVE' then do
                    if data = 'FALSE' then do
                        set label bsave enable
                        logbook_autosave=FALSE      
                    end
                    else do
                        set label bsave disable
                        logbook_autosave=TRUE
                    end
                end
                when elem = 'CBAUTOSORT' then do
                    if data = 'FALSE' then do
                        set label bsort enable
                        logbook_autosort=FALSE      
                    end
                    else do
                        set label bsort disable
                        logbook_autosort=TRUE
                    end
                end
                when elem = 'BPRINT' then do
                    set label bprint disable
                    call logprint
                end
                when elem = 'PRINTREADY' then do
                    set label bprint enable
                    ok = delete(LOGTEMP)
                    read label shint
                    if substr(result,1,3) ~= "ERR" then
                        call sethint "Druckprozess beendet !"
                   
                end
                when elem = 'BFILTER' then do
                    if filtert = 0 then do
                        if changed = 1 then do
                            ok = translate(rtezrequest('Logbuch speichern ?',' _Ja |_Nein'))
                            if ok = "JA" | ok = 1 then do
                                call SortList
                                call logsave
                                changed = 0
                            end
                        end
                        read label lvlog var orglogs
                        filtert = 1
                        set label bsave disable
                        set label bedit disable
                        set label binsert disable
                        set label bdelete disable
                        set label bload disable
                        set label bsort disable
                        set label cbautosort disable
                        set label cbautosave disable
                        call LogFilter
                        setlist label lvlog clear
                        sel = filogs.1
                        setlist label lvlog clear
                        setlist label lvlog stem filogs select '"'sel'"'
                        call sethint filogs.COUNT" passende Logbucheinträge gefunden."
                    end
                    else do
                        set label bsave enable
                        set label bedit enable
                        set label binsert enable
                        set label bdelete enable
                        set label bload enable
                        set label bsort enable
                        set label cbautosort enable
                        set label cbautosave enable
                        call SetPref
                        filtert = 0

                        sel = orglogs.orglogs.SELECT
                        sel = lastData
                        /*
                        drop orglogs.SELECT
                        */
                        setlist label lvlog clear
                        setlist label lvlog stem orglogs select '"'sel'"'
                                                
                        call sethint orglogs.COUNT" Logbucheinträge geladen."
                    end
                end
                when elem = 'SETCALL' then do
                    settext label scall data
                end
                when elem = 'STIMEB' then do
                    read label stimeb
                    ti = result
                    if substr(ti,3,1) = '.' then ti = overlay(":",ti,3)
                    if ~VerifyForm(ti,"HH:MM") then do
                        call SetHint "Formatfehler bei Beginn-Zeit"
                        settext label stimeb "--:--"
                    end
                    else
                        settext label stimeb ti
                end
                when elem = 'STIMEE' then do
                    read label stimee
                    ti = result
                    if substr(ti,3,1) = '.' then ti = overlay(":",ti,3)
                    if ~VerifyForm(ti,"HH:MM") then do
                        call SetHint "Formatfehler bei Ende-Zeit"
                        settext label stimee "--:--"
                    end
                    else
                        settext label stimee ti
                end
                when elem = 'SETHINT' then do
                    call SetHint data
                end
                when elem = 'BGOTO' then do
                    busy set
                    read label sdate
                    datum = result
                    read label scall
                    call = result
                    key = datum"#?"
                    if call > "" then
                        key = key||call"#?"
                    call SetHint "Suche Position ab "key
                    read label lvlog var filogs
                    filogs.0 = filogs.count
                    data = LSEARCH(key,'filogs',1,'N','P')
                    call SetHint key" gefunden ab Position "data
                    if data >= 1 then do
                        filogs.SELECT = data
                        setlist label lvlog clear
                        setlist label lvlog stem filogs
                        z = filogs.data
                        call FillStrukt z
                        call WriteMask
                        if show( 'p', "CALL" ) = 1 then do                        
                            address 'CALL' 'ACTIVE'
                        end
                    end
                    else do
                        call SetHint key" nicht im Logbuch."
                    end
                    drop filogs
                    drop key
                    busy
                end
                when elem = 'SETCURSOR' then do
                    data = word(data,words(data))
                    if data >= 1 then do
                        read label lvlog var filogs
                        filogs.SELECT = data
                        setlist label lvlog clear
                        setlist label lvlog stem filogs /* select '"'data'"'*/
/*                 
                        setlist label lvlog select '"'data'"'
*/
                        z = filogs.data
                        call FillStrukt z
                        call WriteMask                         
                        drop filogs
                    end
                    else do
                        call SetHint "InfoError QSO-Nr: "data" nicht gültig."
                    end
                end
                when elem = "BUSY" then busy set
                when elen = "USE" then busy
                otherwise do

                end
            end 
            if debug = 'TRUE' then do
                call SetHint '['elem'] 'data
            end
        end
    end

    if windowpos_save = 'TRUE' then
        call SaveWindow "LOGBOOK"

    'hide unload'    

    address value listhost
    'hide unload' 
    
    CALL CLOSEPORT( "LOGBOOK" )

    if lchvr = TRUE then do
        address command "varexx:bin/vxc"
    end

exit

VerifyForm: procedure
parse arg s,f

    ok = 0

    f = translate(f)

    select
        when f = 'HH:MM' then do
            if length(s) = 5 then do
                if substr(s,3,1) = ':' then do
                    hh = substr(s,1,2)
                    mm = substr(s,4,2)
                    if hh >= "00" & hh <= "23" then do
                        if mm >= "00" & mm <= "59" then do
                            ok = 1
                        end
                    end
                end
            end
        end
        when f = 'DEC' then do
            if verify(s,"0123456789.") = 0 then ok = 1
        end
        when f = 'INT' then do
            if verify(s,"0123456789") = 0 then ok = 1
        end
        otherwise nop
    end

return ok


LogFilter:

    busy set

    call ReadMask

    filogs.COUNT = 0

    maxf = 0

    fqslto   = word(mask.!QSL,1)    
    fqslfrom = word(mask.!QSL,2)

    if mask.!DATUM ~= "--.--.--" then maxf = maxf + 1
    if mask.!CALL ~= "?" then maxf = maxf + 1
    if fqslto ~= "-" then maxf = maxf + 1
    if fqslfrom ~= "-" then maxf = maxf + 1
    if mask.!BAND ~= "-" then maxf = maxf + 1
    if mask.!MODE ~= "-" then maxf = maxf + 1
    if mask.!POWER ~= "-" then maxf = maxf + 1    

    do i = 1 to orglogs.COUNT

        z = orglogs.i

        zqslto   = word(z,11)    
        zqslfrom = word(z,12)

        sok = 0
        if mask.!DATUM ~= "--.--.--" & pos(mask.!DATUM,z) > 0 then sok = sok + 1            
        if mask.!CALL ~= "?" & pos(mask.!CALL,z) > 0 then sok = sok + 1
        if fqslto ~= "-" & fqslto = zqslto then sok = sok + 1 
        if fqslfrom ~= "-" & fqslfrom = zqslfrom then sok = sok + 1 
        if mask.!BAND ~= "-" & mask.!BAND = word(z,5) then sok = sok + 1
        if mask.!MODE ~= "-" & mask.!MODE = word(z,7) then sok = sok + 1
        if mask.!POWER ~= "-" & mask.!POWER = word(z,9) then sok = sok + 1

        if sok = maxf then do
            anz = filogs.COUNT
            anz = anz + 1
            filogs.anz = z
            filogs.COUNT = anz            
        end

    end

    busy

return

DeleteLog:

    drop logs.

    logs.0 = 0
    logs.COUNT = 0

    read label lvlog var logs
    
    qsonr = logs.SELECT

    if qsonr > 0 then do

        item = '"'logs.qsonr'"'

        setlist label lvlog DEL item

    end

return

SortList:

    busy set

    read label lvlog var logs

    call Sorter

    setlist label lvlog clear

    setlist label lvlog stem logs

    busy

return

LogSave:

    busy set

    name = LOGBOOK_DBF
    back = LOGBOOK_BACKUP
    
    if exists(name) then do
        shell command "copy "name" to "back" >nil:"
        /*
        shell command "delete "name" >nil:"
        */
    end

    read label lvlog var logs

    logs.0 = logs.COUNT

    ok = WriteFile(name,"logs")

    call SetHint logs.0" QSO's wurden gespeichert."

    busy

return

FillStrukt:
parse arg z

    mask.!DATUM = word(z,1)
    mask.!ZEITB = word(z,2)
    mask.!ZEITE = word(z,3)
    call  = word(z,4)
    if pos('/',call) = 0 then do
        mask.!CALL = call
        mask.!ZS = 0
        mask.!ZSS = ""
    end
    else do
        mask.!CALL = substr(call,1,pos('/',call) - 1)
        zs = strip(substr(call,pos('/',call),3))        
        do i = 0 to calz.!ANZ
            if zs = calz.i then leave
        end
        mask.!ZS = i
        mask.!ZSS = calz.i
    end

    if mask.!CALL = "" then mask.!CALL = "-/-"

    mask.!BAND  = word(z,5)
    mask.!QRG   = word(z,6)

    if mask.!QRG = "" then mask.!QRG = "-/-"

    mask.!MODE  = word(z,7)
    mask.!RST   = word(z,8)
    mask.!POWER = word(z,9)
    mask.!REL   = word(z,10)
    mask.!QSL   = word(z,11)
    mask.!QSL   = mask.!QSL" "word(z,12)

    mask.!BANDPOS = -1
    do i = 0 to band.COUNT
        if translate(mask.!BAND) = translate(band.i) then do
            mask.!BANDPOS = i - 1
            leave
        end
    end
    mask.!POWERPOS = -1
    do i = 1 to pwr.COUNT
        if translate(mask.!POWER) = translate(pwr.i) then do
            mask.!POWERPOS = i - 1
            leave
        end
    end
    mask.!MODEPOS = -1
    do i = 1 to mode.COUNT
        if translate(mask.!MODE) = translate(mode.i) then do
            mask.!MODEPOS = i - 1
            leave
        end
    end

    mask.!REM = strip(substr(z,100,99))

return

WriteMask:

    busy set

    "settext label sdate"   mask.!DATUM
    "settext label stimeb"  mask.!ZEITB
    "settext label stimee"  mask.!ZEITE
    "settext label scall"   mask.!CALL
    "settext label sqrg"    mask.!QRG
    "setnum label czusatz"  mask.!ZS

    r = substr(mask.!RST,1,1) - 1
    s = substr(mask.!RST,2,1)
    if s = "-" then s = 0
    t = substr(mask.!RST,3,1)
    if t = "-" then t = 0
    db = strip(substr(mask.!RST,4,length(mask.!RST)))

    "setnum label rstr" r
    "setnum label rsts" s
    "setnum label rstt" t

    qsl1 = word(mask.!QSL,1)
    qsl2 = word(mask.!QSL,2)

    qsl = GetQSLPos(qsl1)
    "setnum label qslto "qsl
    
    qsl = GetQSLPos(qsl2)
    "setnum label qslfrom "qsl

    "setnum label cband "mask.!BANDPOS
    "setnum label cpower "mask.!POWERPOS
    "setnum label cmode "mask.!MODEPOS

    if mask.!REL = "D" then
        "setcheck label cbrel CHECK"
    else
        "setcheck label cbrel"

    "settext label srem "mask.!REM

    if s = 9 then do
        set label sdb enable
        "settext label sdb "db
    end
    else do
        set label sdb disable
        "settext label bdb  "
    end

    busy    

return

GetQSLPos: procedure
parse arg qsl

    qsl = translate(qsl)

    select
        when qsl = "-" then qslpos = 0
        when qsl = ">" then qslpos = 1
        when qsl = "X" then qslpos = 2
        otherwise qslpos = -1
    end

return qslpos

ReadMask:

    read label sdate
    mask.!DATUM = result

    if mask.!DATUM = "" then mask.!DATUM = "--.--.--"

    read label stimeb
    mask.!ZEITB = result
    
    if mask.!ZEITB = "" then mask.!ZEITB = "--:--"

    read label stimee
    mask.!ZEITE = result

    if mask.!ZEITE = "" then mask.!ZEITE = "--:--"

    'read label sqrg'
    mask.!QRG = result

    if mask.!QRG = "" then mask.!QRG = "-"

    read label scall
    mask.!CALL = result

    if mask.!CALL = "" then mask.!CALL = "?"

    read label czusatz
    mask.!CALL = mask.!CALL||calz.result

    read label cband
    p = result + 1
    mask.!BAND = band.p

    read label cmode
    p = result + 1
    mask.!MODE = mode.p

    read label cpower
    p = result + 1
    mask.!POWER = pwr.p

    read label rstr
    r = result + 1
    read label rsts
    s = result
    if s = 0 then s = '-'
    read label rstt
    t = result
    if t = 0 then t = '-'
    read label sdb
    db = strip(result)
    mask.!RST = r||s||t||db

    read label cbrel
    if result = TRUE then
        mask.!REL = 'D'
    else
        mask.!REL = 'S'

    read label qslto
    mask.!QSL = qsl.result

    read label qslfrom
    mask.!QSL = mask.!QSL" "qsl.result

    read label srem
    mask.!REM = result

    if mask.!REM = 'MASK.!REM' then mask.!REM = ""

return

InsertLog:

    zeile = MakeLogLine()

    anz = logs.COUNT
    anz = anz + 1
    logs.COUNT = anz
    logs.anz = zeile

return

MakeLogLine: procedure expose mask.

    zeile = ""

    zeile = overlay(mask.!DATUM,zeile,1)
    zeile = overlay(mask.!ZEITB,zeile,10)
    zeile = overlay(mask.!ZEITE,zeile,16)
    zeile = overlay(mask.!CALL,zeile,22)
    zeile = overlay(mask.!BAND,zeile,39)
    zeile = overlay(mask.!QRG,zeile,45)
    zeile = overlay(mask.!MODE,zeile,58)
    zeile = overlay(mask.!RST,zeile,66)
    zeile = overlay(mask.!POWER,zeile,75)
    zeile = overlay(mask.!REL,zeile,79)
    zeile = overlay(mask.!QSL,zeile,81)
    zeile = overlay(mask.!REM,zeile,100)

return zeile

setdate:
    datum = date("S")
    fdatum = substr(datum,7,2)'.'substr(datum,5,2)'.'substr(datum,3,2)
    settext label sdate fdatum
return

loadQRG:

    busy set

    qrg.COUNT = 0
    qrg.0 = 0

    ok = readfile(QRG_DBF,"qrg")

    qrg.COUNT = qrg.0

    busy

return

ShowQRG:
parse arg sqrg

    if LastQRG = sqrg then return

    busy set

    setlist label lvqrg clear

    do i = 1 to qrg.COUNT
        if translate(word(qrg.i,1)) = translate(sqrg) then do
            zeile = '"'strip(substr(qrg.i,6,100))'"'
            setlist label lvqrg zeile
        end
    end

    LastQRG = sqrg

    busy

return

loadLog:

    busy set

    name = LOGBOOK_DBF    

    logs.0 = 0

    ok = readfile(name,"logs")

    logs.COUNT = logs.0

    setlist label lvlog CLEAR

    setlist label lvlog stem logs

    call SetHint "Logbuch "name" enthält "logs.COUNT" QSO's"

    cnt = logs.COUNT
    sel = '"'logs.cnt'"'
    setlist label lvlog select"="sel

    busy

return

utc: procedure expose UTC_OFFSET
parse arg iz
   
    h = substr(iz,1,2)
    m = substr(iz,4,2)

    h = h - UTC_OFFSET

    do forever
        if h >= 0 then leave
        h = h + 24
        /* datum -- */
    end

    if length(h) = 1 then h = '0'h

    oz = h':'m

return oz

Sorter:
    busy set

    read label lvlog var logs

    if SORT_ALGO = 'TRUE' then
        call RTSort
    else
        call BubbleSort

    busy
return

RTSort: procedure expose logs.

    logs.0 = logs.COUNT

    busy set

    call sethint "Sortieren QSO's läuft ..... Step 1 ..."

    logx.0 = logs.0
    loga.i = logs.0
    do i = 1 to logs.0
        /* 12345678901234 */
        /* 99.99.99 hh:mm */
        logx.i = substr(logs.i,7,2)||substr(logs.i,4,2)||substr(logs.i,1,2)
        logx.i = logx.i||substr(logs.i,10,5)' 'i
        loga.i = logs.i
    end

    call sethint "Sortieren QSO's läuft ..... Step 2 ..."
    call qsort "logx"
    call sethint "Sortieren QSO's läuft ..... Step 3 ..."
    do i = 1 to logx.0
        ptr = word(logx.i,2)
        logs.i = loga.ptr
    end
    call sethint logs.0" QSO's nach Datum und Beginn-Zeit sortiert."
    busy

return

BubbleSort: procedure expose logs.

    muster.1 = "/"
    muster.2 = "-"
    muster.3 = "\"
    muster.4 = "|"
    m = 1

    do x = 1 to logs.COUNT - 1

        call sethint "Sortieren QSO's läuft ..... ("muster.m")"
        m = m + 1
        if m > 4 then m = 1

        do y = x + 1 to logs.COUNT
            a = logs.x
            b = logs.y
            sa = strip(substr(a,9,length(a)))
            sb = strip(substr(b,9,length(b)))
            sa = substr(a,7,2)'.'substr(a,4,2)'.'substr(a,1,2)' 'sa
            sb = substr(b,7,2)'.'substr(b,4,2)'.'substr(b,1,2)' 'sb
            if sa > sb then do
                logs.x = b
                logs.y = a
            end
        end
    end

return

SetHint:
parse arg zeile

    settext label shint zeile

return

LoadWindow:
parse arg winname

    fn = 'data/'winname'.set'

    win.X = 0
    win.Y = 0

    if open(WINDBF,fn,"READ") then do
        do forever
            if eof(WINDBF) then leave
            z = readln(WINDBF)
            p = pos("=",z)
            if p > 1 then do
                c = translate(substr(z,1,p - 1))
                d = strip(substr(z,p + 1,length(z)))
                select
                    when c = 'WINX' then win.X = d
                    when c = 'WINY' then win.Y = d
                    otherwise nop
                end
            end
        end
        call close WINDBF
    end

    'window x='win.x 'y='win.y

return

SaveWindow:
parse arg winname

    fn = 'data/'winname'.set'

    readcords win

    if open(WINDBF,fn,"WRITE") then do
        ok = writeln(WINDBF,"WINX="win.x)
        ok = writeln(WINDBF,"WINY="win.y)
        call close WINDBF
    end

return

AutoSort:
    call SortList
return

SetPref:

    if logbook_autosort = 'FALSE' then do
        set label bsort enable 
        setcheck label cbautosort
    end   
    else do
        set label bsort disable                
        setcheck label cbautosort check
    end

    if logbook_autosave = 'FALSE' then do
        set label bsave enable 
        setcheck label cbautosave
    end   
    else do
        set label bsave disable                
        setcheck label cbautosave check
    end

    setnum label cband GetBand(LOGBOOK_INIT_BAND) - 1
    setnum label cpower GetPower(LOGBOOK_INIT_POWER) - 1
    setnum label cmode GetMode(LOGBOOK_INIT_MODE) - 1

return

LoadPref:
    
    name = "data/logger.pref"
    if readfile(name,"prefs") then do
        do i = 1 to prefs.0
            interpret prefs.i
        end
    end

    if PUBLIC_SCREEN = "PUBLIC_SCREEN" then 
        pscr = ""
    else do
        if PUBLIC_SCREEN > "" then
            pscr = "PS="PUBLIC_SCREEN
        else
            pscr = ""
    end


    if UTC_OFFSET < 0 then UTC_OFFSET = UTC_OFFSET * -1

return

logprint:

    busy set

    read label lvlog var logs

    logs.0 = logs.COUNT

    if writefile(LOGTEMP,"logs") = 1 then do
        call SetHint "Druckprozess wurde gestartet ... "
        shell command "run >nil: <nil: "REXXRUN "code/export.rexx"
    end
    else do
        call SetHint "Temporäre Datei konnte nicht geschrieben werden, Pfad?"
        set label bprint enable
    end

    busy

return

GetBand:
parse arg iband

    iband = strip(translate(iband))

    bnr = 0

    do i = 0 to band.COUNT
        if strip(translate(band.i)) = iband then do
            bnr = i
            leave
        end
    end

return bnr

GetPower:
parse arg ipower

    ipower = strip(translate(ipower))

    pnr = 0

    do i = 1 to pwr.COUNT
        if strip(translate(pwr.i)) = ipower then do
            pnr = i
            leave
        end
    end

return pnr

GetMode:
parse arg imode

    imode = strip(translate(imode))

    pnr = 0

    do i = 1 to mode.COUNT
        if strip(translate(mode.i)) = imode then do
            pnr = i
            leave
        end
    end

return pnr

SetCycles:

    if readfile("data/POWER.CYC","pwr") then do
        pwr.COUNT = pwr.0
        pt = ""
        do i = 1 to pwr.COUNT
            pt = pt||pwr.i" "
        end
        setlabel 'label=cpower' 'CYCLE' pt
    end
    else do
        setlabel 'label=cpower' 'CYCLE' '???'
    end

    if readfile("data/BAND.CYC","band") then do
        band.COUNT = band.0
        pt = ""
        do i = 1 to band.COUNT
            pt = pt||band.i" "
        end
        setlabel 'label=cband' 'CYCLE' pt
    end
    else do
        setlabel 'label=cband' 'CYCLE' '???'
    end

    if readfile("data/MODE.CYC","mode") then do
        mode.COUNT = mode.0
        pt = ""
        do i = 1 to mode.COUNT
            pt = pt||mode.i" "
        end
        setlabel 'label=cmode' 'CYCLE' pt
    end
    else do
        setlabel 'label=cmode' 'CYCLE' '???'
    end


return

/* Error messages */
failure:
    busy
    SAY "Error code" rc "-- Line" SIGL
    SAY "Externer Error:"
    SAY "EXTERNERROR"
    'hide unload'
    address value listhost
    'hide unload' 
    CALL CLOSEPORT "LOGBOOK"
    if lchvr = TRUE then address command "varexx:bin/vxc"
EXIT

syntax:
    busy
    SAY "Error" rc  "-- Line" SIGL
    SAY "Interner REXX Error"
    SAY ERRORTEXT( rc )
    'hide unload'
    address value listhost
    'hide unload' 
    CALL CLOSEPORT "LOGBOOK"
    if lchvr = TRUE then address command "varexx:bin/vxc"
EXIT

halt:
    busy
    'hide unload'
    address value listhost
    'hide unload' 
    CALL CLOSEPORT "LOGBOOK"
    if lchvr = TRUE then address command "varexx:bin/vxc"
    exit
