##
## functions
##
##  HTTPHEAD      - http server respone
##  search        - search in local swish++ index
##  message       - xmessage
##  ask           - xmessage
##  gui_browser   - helper for start_browser
##  start_browser - open URL in either w3m or firefox
##  umlaut4url    - helper for google/wiki
##  google        - open google (-l de, -ie ISO-8859-1, -ie UTF-8
##  latin2english - use lysy2.archives.nd.edu to translate
##  wiki          - open http://(de|en).wikipedia.org/wiki/...
##  lx            - ls and sort by size
##  u             - english <=> deutsch (exakt)
##  U             - english <=> deutsch (partial/ignorecase)
##  dict          - simple dictd client
##  volume        - get/set audio volume
##  colorsel      - open finders color-select (lupe to grab)
##  ocr           - Tesseract Open Source OCR Engine

function HTTPHEAD
{
    local host=${1:-"wais.org"}
    local port=${2:-"80"}
    #echo nc $host $port
    echo -e "HEAD / HTTP/1.1\nHost:$host\nConnection: Close\n" | nc -w 10 $host $port
}

function search_find_db
{
    cd ~/lib/swish && ls swish++.conf.* | sed 's/^swish++.conf.//' | tr '\n' ' '
}
# search and edit:
function searche
{
    ${EDITOR:-vi} $( search "$@" | sed -n '/^[1-9]/s/^[0-9]* \([^ ]*\) .*/\1/p' )
}
function search
{
    local index
    local args

    while [ "X$1" != "X" ] ; do
        case "X$1" in
            X-m) shift; index="$index $1"; shift;;
            X-n) shift; args="--max-results $1"; shift;;
            X--*) break;; # e.g. --near=5
            X-*) echo "usage: search [ -m $(search_find_db | sed 's/ /|/g') ] term ..">&2; return;;
            *) break;;
        esac
    done

    index=${index:-$(search_find_db)}
    (
      cd ~/lib/swish
      for i in $index ; do
        echo -n "$i "
        /usr/local/bin/search $args -c swish++.conf.$i $* # || break
      done
    )
}

# Message-ID: <43215DF3.2090301@wanadoo.fr>
# unix-porting@lists.apple.com
# Fri, 09 Sep 2005 12:03:31 +0200
# Use "System Events" instead of "Finder"
function message
{
    local msg=${*:-"gute nacht!"}
    msg=$(echo $msg | iconv -f ISO-8859-15 -t MAC)
    osascript -e "tell app \"finder\"
    activate
    display dialog \"$msg\" buttons \"ok\" default button 1
    end" >/dev/null 2>&1 || true
}
function ask
{
    local msg=${*:-"gute nacht!"}

    osascript -e "tell app \"finder\"
    activate
    display dialog \"$msg\" buttons { \"ja\", \"nein\" } default button 1
    end" | grep -q ':ja'
}
function ask2
{
    local y="gute"
    local n="nacht"
    [ "X$1" != "X" ] && { y="$1" ; shift ; n="$*" ; }

    osascript -e "tell app \"finder\"
    activate
    choose from list { \"$y\", \"$n\" }
    end"
}

function gui_browser
{
    local url
    local cmd=openURL
    while [ "X$1" != "X" ] ; do
        case "X$1" in
             X-e) cmd="get URL";;
             Xhttp:*|Xftp:*|Xfile:*|Xhttps:*|X/*) url="$1" ;;
             *) url="file://$PWD/$1" ;;
        esac
        shift
    done
    /usr/bin/osascript -e "tell app \"Firefox\" to $cmd \"$url\""
}
function start_browser
{
    local browser=${TTYBROWSER:-w3m}
    while [ "X$1" != "X" ] ; do
        case "X$1" in
            X-n) browser=echo; shift;;
            X-x) browser=gui_browser; shift;;
            *) break;;
        esac
    done
    $browser "$@"
}

# see function google and function wiki
# TODO perl?
# A LOT OF FORKS
function umlaut4url
{
    local what="$@"
    # Ä Ö Ü ä ö ü ß
    what=`echo $what | sed 's/[äÄ]/%C3%A4/g'`
    what=`echo $what | sed 's/[öÖ]/%C3%B6/g'`
    what=`echo $what | sed 's/[üÜ]/%C3%BC/g'`
    what=`echo $what | sed 's/ß/%C3%9F/g'`
    what=`echo $what | sed 's/(/%28/g;s/)/%29/g'`
    echo $what
}

alias deja='google -u groups.google.com/groups'
function google
{
    local lang
    local code
    local what
    local url
    local browserargs

    ### [ "$DISPLAY" != "" ] && wie="galeon -n"

    #http://www.google.de/search?hl=de&ie=ISO-8859-1&q=appft1+microsoft+linux+patent&btnG=Google-Suche&meta=

    while [ "X$1" != "X" ] ; do
        case "X$1" in
            "X-l")  shift; lang=$1; shift;;
            "X-u")  shift; url=$1; shift;;
            "X-ie") shift; code=$1; shift;;
            "X-h")  echo "usage: google [-x] [-l de|en] [-n] word .."; return;;
            X-*) browserargs="$browserargs $1"; shift;;
            *) break;;
        esac
    done

    # "so wie so" => %22so_wie_so%22
    what=`echo $* | sed 's/^ *//;s/ /+/g;s/"/%22/g'`
    what=`umlaut4url $what`

    url="${url:-www.google.${lang:-com}/search}"
    url="http://${url}?${code:+ie=${code}&}q=$what"

    start_browser $browserargs "$url"
}

function latin2english
{
    [ $# -eq 1 ] && {
        w3m -dump "http://lysy2.archives.nd.edu/cgi-bin/words.exe?$1";
    } || {
        echo "usage: latin2english latinword" >&2;
    }
}

# todo
# http://de.wikipedia.org/wiki/Spezial:Search/SoMeThInG
function wiki
{
    local lang=de
    local url
    local browserargs
    while [ "X$1" != "X" ] ; do
        case "X$1" in
            "X-l")  shift; lang=$1; shift;;
            "X-h")  echo "usage: wiki [-x] [-l de|en] [-n] word .."; return;;
            X-*) browserargs="$browserargs $1"; shift;;
            *) break;;
        esac
    done

    what=`echo $* | sed 's/ /_/g'`
    what=`umlaut4url $what`

    # wikidate if no URL gien
    if [ "X$what" = "X" ] ; then
        url=http://en.wikipedia.org/wiki/`date +%B_%e | sed "s/ //"`
    else
        url="http://${lang}.wikipedia.org/wiki/${what}"
    fi

    start_browser $browserargs "$url"
}

# ls sorted by size
function lx ()
{
  /bin/ls -l "$@" | sort -k5 -n
}

function u { LANG=de_DE.ISO8859-15 grep -w "$*" $HOME/Public/de-en; }
function U { grep -i "$*" $HOME/Public/de-en; }

function dict
{
    # see ~/Documents/rfc2229.txt
    #
    # dict://<user>;<auth>@<host>:<port>/d:<word>:<database>:<n>
    # dict://<user>;<auth>@<host>:<port>/m:<word>:<database>:<strat>:<n>
    #
    # The "/d" syntax specifies the DEFINE command (section 3.2), whereas
    # the "/m" specifies the MATCH command (section 3.3).
    #
    # for a list of dict servers:
    # http://www.luetzschena-stahmeln.de/dictd/index.php

    local pager=/bin/cat
    /usr/bin/tty 0>&1 >/dev/null 2>&1 && pager=${PAGER:-/usr/bin/less}

    (
    # localhost mapped with VBoxManage to debian, see ~/Documents/install.txt
    for host in 192.168.2.2 dict.org; do
        echo -n "trying $host ..."
        /usr/bin/curl --connect-timeout 3 "dict://$host/d:'$1':\*" && echo
    done
    ) 2>&1 | $pager
}

function volume
{
    if [ "X" = "X$1" ]; then
        osascript -e 'get volume settings'
    else
        osascript -e "set volume output volume $1"
    fi
}

function colorsel
{
    # colorsel:                         63423 51643 22400
    # use high-byte and convert to hex: F7C957
    col=`osascript -e "tell app \"finder\"
         activate
         choose color
         end" | tr -d ','`
    colhex=`echo $col | sed 's/^/obase=16 /' | tr ' ' '\n' | bc | cut -c 1,2 | tr -d '\n'`
    echo $col
    echo $colhex
}

function ocr
{
    # http://www.geocities.com/thierryguy/ocube.sh.html
    # convert in.x -density 150x150 -resize 200% -fill white -tint 50 -level 20%,80%,1.0 \
    #         -sigmoidal-contrast 30,50% -sharpen 0x2 -compress none -monochrome out.tiff
    case "$1" in
        *.tiff) /opt/local/bin/tesseract $1 ${1%.tiff};;
        *) echo -e "Usage: ocr file.tiff\n\tuse 'convert -monochrome in.tiff out.tiff for best quality";;
    esac
}
