#!/bin/bash

# menu.sh
# menu system

function menu () {
  menu_back_active=
  menu_stop_active=
  local menuproc=$1
  local selected=$2; selected=${selected:-0}
  while [ -z "$menu_stop_active" ] && [ -z "$menu_back_active" ]; do
    unset menu_items menu_title menu_data
    $menuproc init
    [ -z "$menu_data" ] || menu_list2array "$menu_data"
    while [ "${menu_items[$selected]:0:1}" == "-" ]; do
      : $((selected++))
    done
    local choice=nothing
    while [ ! -z "$choice" ]; do
      menu_redraw $selected
      menu_getkey
[ "$choice" == "q" ] && exit 0
      if [ "$choice" == "arrowA" ]; then
        local old=$selected
        : $((selected--))
        while [ "${menu_items[$selected]:0:1}" == "-" ]; do
          : $((selected--))
        done
        [ $selected -lt 0 ] && selected=$old
      fi
      if [ "$choice" == "arrowB" ]; then
        local old=$selected
        : $((selected++))
        while [ "${menu_items[$selected]:0:1}" == "-" ]; do
          : $((selected++))
        done
        [ $selected -eq ${#menu_items[*]} ] && selected=$old
      fi
    done
    clear
    if [ "${menu_items[$selected]##*~}" != "${menu_items[$selected]}" ]; then
      # menu item contains ~
      eval ${menu_items[$selected]##*~}
    else
      $menuproc $selected
    fi
    [ "$menuproc" == "main_menu" ] && menu_back_active=
  done
  menu_stop_active=
  return 1
}

function menu_stop () {
  menu_stop_active=true
  return 1
}

function menu_back () {
  menu_back_active=true
  return 1
}

function menu_redraw () {
  header
  echo -e "    # $menu_title\n"
  local sel=$1 length=${#menu_items[*]} scroll=0
  if [ $length -gt 15 ]; then
   scroll=$((sel - 7))
   [ $((scroll+15)) -gt $length ] && scroll=$((length-15))
   [ $scroll -lt 0 ] && scroll=0
   length=$((scroll+15)) # don't show the rest of items
  fi
  for((i = scroll ; i < length ; i++)); do
    local item="${menu_items[$i]%~*}"
    if [ "$i" -eq "$sel" ]; then
      echo ">> * $item"
    else
      [ "${item:0:1}" == "-" ] && echo "     ${item#-}" || echo "   * $item"
    fi
  done
  echo -en "\n Up/Down = choose, Enter = confirm    "
}

function menu_getkey () {
  ## sets $choice to arrowA if user presses arrow up,
  ## to arrowB if user presses arrow down,
  ## and to empty string if user presses Enter
  
  # note: "bind" works only in interactive shells,
  # so we make one and put the script we need in its rcfile
  get_tmp_filename
  cat > "$file" <<HEREDOC
bind -r "\e[A"; bind '"\e[A": "arrowA\C-m"'
bind -r "\e[B"; bind '"\e[B": "arrowB\C-m"'
read -es val; echo "\$val"; exit
HEREDOC
  choice="`bash --rcfile "$file" -i`"
}

function menu_list2array () {
  unset menu_items
  local i=0
  data=`echo "$1" | sed 's/^ *//g'`
  for item in $data; do
    if [ ! -z "$item" ]; then
      menu_items[$i]="$item"
      : $((i++))
    fi
  done
}



