alias away if (![$0]) { back } {
    me is away -- $0- -- messages will be saved.
    //away $0-
    Light.setAway $0-
}

alias back {
    if ([$0]) { me $0- } { me $LIGHT.Msgs.back }
    //away
    if (LIGHT.Data.isAway) Light.setBack
}

alias quietaway if (![$0]) { quietback } {
    //away $0-
    Light.setAway $0-
}

alias quietback {
    //away
    if (LIGHT.Data.isAway) Light.setBack
}

alias aaway if (![$0]) { aback } {
    ame is away -- $0- -- messages will be saved.
    ^//away -all $0-
    Light.setAway $0-
}

alias aback {
    if ([$0]) { ame $0- } { ame $LIGHT.Msgs.back }
    ^//away -all
    if (LIGHT.Data.isAway) Light.setBack
}

alias aquietaway if (![$0]) { aquietback } {
    ^//away -all $0-
    Light.setAway $0-
}

alias aquietback {
    ^//away -all
    if (LIGHT.Data.isAway) Light.setBack
}

alias clearmessages {
    if ([] == LIGHT.Data.currentAwayLog) return
    Light.closeLogger
    @unlink($LIGHT.Data.currentAwayLog)
    ^assign -LIGHT.Data.awayCount
    ^set -status_user2
    if (LIGHT.Data.isAway) {
        Light.openLogger
        Light.setAway
    } {
        ^assign -LIGHT.Data.currentAwayLog
    }
}

alias showmessages {
    lecho A Saved message log:
    if (1 == fexist($LIGHT.Data.currentAwayLog)) {
        @:old_hold_mode = HOLD_MODE
        ^set HOLD_MODE on
        @:fd   = open($LIGHT.Data.currentAwayLog R)
        @:line = read($fd)
        while (!eof($fd)) {
            echo $line
            @line = read($fd)
        }
        @close($fd)
        ^set HOLD_MODE $old_hold_mode
    } {
        lecho ! No saved messages to show.
    }
}

alias Light.writeToLogger {
    @LIGHT.Data.awayCount++
    if (LIGHT.Data.awayCount > 0) {
        ^set status_user2  [Saved: $LIGHT.Data.awayCount]
    }
    @write($LIGHT.Data.awayLogFD $0-)
}

alias Light.closeLogger {
    if ([] != LIGHT.Data.awayLogFD) {
        @close($LIGHT.Data.awayLogFD)
        ^assign -LIGHT.Data.awayLogFD
    }
}

alias Light.openLogger {
    @LIGHT.Data.awayLogFD = open($LIGHT.Data.currentAwayLog w)
    @LIGHT.Data.awayCount = 0
}

alias Light.setAway {
    if (!LIGHT.Data.isAway) {
        @LIGHT.Data.isAway         = 1
        @LIGHT.Data.currentAwayLog = LIGHT.Files.awayLog ## [.$pid()]
        Light.openLogger
    }
    if ([$0-]) {
        @LIGHT.Data.awayAt      = Z
        @LIGHT.Data.awayBecause = [$0-]
    }
    @LIGHT.Data.awayCount--
    Light.writeToLogger >> set away at $LIGHT.Data.awayAt - $LIGHT.Data.awayBecause <<
}

alias Light.setBack {
    ^assign -LIGHT.Data.isAway
    Light.closeLogger
    showmessages
    if (LIGHT.Data.awayCount) {
        if ([y] == [$"Clear saved messages? \[y/N\] "]) { clearmessages }
    } {
        clearmessages
    }

    ^assign -LIGHT.Data.awayAt
    ^assign -LIGHT.Data.awayBecause
}
