#!/bin/bash
list=( {a..z} )
init(){
  MIN_INDEX=0
  MAX_INDEX=$(( ${#list[@]} - 1 ))
  ITEM_NUM=${#list[@]}
  PAGE_SIZE=10
  PAGE_WIDTH=10
  PAGE_NUM=$(( ( MAX_INDEX % PAGE_SIZE ) ? MAX_INDEX / PAGE_SIZE + 1: MAX_INDEX / PAGE_SIZE ))
  BAR_LEN=$(( (PAGE_SIZE - 2) / PAGE_NUM ))
  (( BAR_LEN <= 0 )) && BAR_LEN=1
  index=0
}

draw(){
  local i page_index page_start page_end bar_len bar_start
  tput cup 0 0
  (( page_index = index / PAGE_SIZE ))

  (( page_start = page_index*PAGE_SIZE ))
  (( page_end = page_start + PAGE_SIZE - 1 ))

  (( bar_start = page_index * (PAGE_SIZE - 2) /PAGE_NUM ))

  printf "index=%2d, page_index=%2d, bar_len=%2d, bar_start=%2d\n" $index $page_index $BAR_LEN $bar_start

  for (( i=page_start; i <=page_end; ++i ))
  do
    (( i == index )) && echo -ne "\033[1;37;44m"
    printf "%-${PAGE_WIDTH}s" "${list[$i]}"

    if (( i == page_start )) ; then
      echo -e "\033[${PAGE_WIDTH}G\033[1;30;47m\0342\0226\0262\033[m"
    elif (( i == page_end )) ; then
      echo -e "\033[${PAGE_WIDTH}G\033[1;30;47m\0342\0226\0274\033[m"
    elif (( i >= page_start + bar_start + 1 && i <= page_start + bar_start + BAR_LEN + 1)) ; then
      echo -e "\033[${PAGE_WIDTH}G\033[1;44m \033[m"
    else
      echo -e "\033[${PAGE_WIDTH}G\033[1;47m \033[m"
    fi
  done
}
input(){
  echo -ne "\033[?25l"
  aKey=(0 0 0 0)
  cESC=`echo -ne "\033"`
  while :
  do
    read -s -n 1 key
    aKey=( "${aKey[@]:1}" "$key")

    if [[ $key${aKey[2]} = $cESC$cESC ]] ; then break
    elif [[ "${aKey[@]:1:2}$key" = "${cESC} [A" ]] ; then (( --index ))
    elif [[ "${aKey[@]:1:2}$key" = "${cESC} [B" ]] ; then (( ++index ))
    elif [[ "${aKey[@]}" = "${cESC} [ 5 ~" ]] ; then (( index-=PAGE_SIZE ))
    elif [[ "${aKey[@]}" = "${cESC} [ 6 ~" ]] ; then (( index+=PAGE_SIZE ))
    else continue
    fi

    if (( index < MIN_INDEX )) ; then index=$MIN_INDEX
    elif (( index > MAX_INDEX )) ; then index=$MAX_INDEX
    fi

    draw $INDEX

  done
  echo -ne "\033[?25h"
}
clear
init
draw
input

