#
# BASH specific functions
#

function write_start () {
  print "start() { handle_" start_name "; }"
}

function write_menu_function_header () {

  if ( menu_class == "template" ) {
    print "handle_" menu_name "_template () {"

  } else {
    print "handle_" menu_name " () {"

  }

  print "local FINISHED=0 CURRENT RESULT=0 DATA NUM_ITEMS HEIGHT"

  if ( menu_class == "template" ) {
    print "local TEMPLATE=$1"

  }
}

function write_menu_boolean_init ( i ) {
  print "local ITEM" i "=off"

  print "get_value ITEM" i " " var_name( menu_var[i])

  return i
}

function write_menu_input_init ( i ) {
  print "local ITEM" i 

  print "get_value ITEM" i " " var_name( menu_var[i])

  return i
}

function write_menu_list_init ( i ) {
  # This next step is probably a bit naughty, but it looks like the
  # best solution ....

  print "local TEMP_" menu_var[i] " LIST_" menu_var[i]

  list_item = i
  line = ""

  print "get_value TEMP_" menu_var[i] " " var_name( menu_var[i])

  list = menu_var[i]

  while (menu_type[i] == "list" && list == menu_var[i]) {
    print "local ITEM" i "=off"
    line = line menu_data[i] ") ITEM" i "=on\n"

    line = line " LIST_" menu_var[i] "=" i " ;;\n"

    i++
  }

  # The while loop overshoots the mark.
  i --

  print "case $TEMP_" menu_var[i] " in "
  print line "esac"

  return i
}

function write_menu_submenu_init ( i ) {
  return i
}

function write_menu_text_init ( i ) {
  return i
}

function write_menu_menu_header () {
  print "if [ \"@$DIALOG_SUPPORTS_CURRENT\" = \"@true\" ]; then"
  print "CURRENT=0"
  print "fi"

  print "while [ $FINISHED -ne 1 ]"
  print "do"
  print "MENU_STRING=\"\""
  print "NUM_ITEMS=0"
}

function write_menu_entry_submenu ( i ) {
  print "MENU_STRING=\"$MENU_STRING " i " \'" escape_string(menu_text[i]) " ---> \'\""
  print "NUM_ITEMS=$[$NUM_ITEMS + 1]"

  return i  
}

function write_menu_entry_boolean ( i ) {
  print "if [ $ITEM" i " = on ]"
  print "then"
  print "MENU_STRING=\"$MENU_STRING " i " \'[X] " escape_string(menu_text[i]) "\'\""
  print "else"
  print "MENU_STRING=\"$MENU_STRING " i " \'[ ] " escape_string(menu_text[i]) "\'\""
  print "fi"
  print "NUM_ITEMS=$[$NUM_ITEMS + 1]"

  return i
}

function write_menu_entry_input ( i ) {
  print "MENU_STRING=\"$MENU_STRING " i " \'" escape_string(menu_text[i]) " \($ITEM" i "\)\'\""
  print "NUM_ITEMS=$[$NUM_ITEMS + 1]"

  return i
}

function write_menu_entry_list ( i ) {
  print "if [ $ITEM" i " = on ]"
  print "then"
  print "MENU_STRING=\"$MENU_STRING " i " \'(X) " escape_string(menu_text[i]) "\'\""
  print "else"
  print "MENU_STRING=\"$MENU_STRING " i " \'( ) " escape_string(menu_text[i]) "\'\""
  print "fi"
  print "NUM_ITEMS=$[$NUM_ITEMS + 1]"

  return i
}

function write_menu_entry_text ( i ) {
  print "MENU_STRING=\"$MENU_STRING " i " \'" escape_string(menu_text[i]) "\'\""
  print "NUM_ITEMS=$[$NUM_ITEMS + 1]"

  return i
}

function write_menu_menu () {
  if ( menu_class == "template" ) {
    print "MENU_STRING=\"$MENU_STRING -1 \'Remove " escape_string(template_text) "\'\""
    print "NUM_ITEMS=$[NUM_ITEMS + 1]"
  }

  # Rule of thumb - Allow 8 lines for the decorations on the menu ... the
  # screen size has already been reduced by the size detection code.
  print "if [ $[$NUM_ITEMS + 8] -gt $ROWS ]"
  print "then"
  print "HEIGHT=$ROWS"
  print "NUM_ITEMS=$[$HEIGHT - 8]"
  print "else"
  print "HEIGHT=$[$NUM_ITEMS + 8]"
  print "fi"

  print "eval $DIALOG --backtitle \'\"" main_title "\"\' --title \'\"" escape_string(menu_title) "\"\' --menu \'\"" escape_string(menu_description) "\"\' $HEIGHT 60 $NUM_ITEMS $CURRENT $MENU_STRING 2> $TEMP"
}

function write_menu_action () {
  print "RESULT=$?"

  print "if [ $RESULT -eq 0 -o $RESULT -eq 3 -o $RESULT -eq 6 ]; then "
  print "RESULT=`cat $TEMP`"

  print "if [ \"@$DIALOG_SUPPORTS_CURRENT\" = \"@true\" ]; then"
  print "CURRENT=$RESULT"
  print "fi"

  print "case $RESULT in "
  for (i = 0; i < menu_items; i++ ) {
    print i ") "
    if ( menu_type[i] == "submenu" ) {
      print "handle_" menu_data[i] " || $DIALOG --backtitle \'Missing Menu Error\' --msgbox \'The menu for " menu_data[i] " appears to be missing.\' 8 60 "
      print ";;"

    } else if ( menu_type[i] == "boolean") {

      print "if [ $ITEM" i " = on ]"
      print "then"
      print "set_value " var_name( menu_var[i]) " \"off\" "
      print "ITEM" i "=off"
      print "else"
      print "set_value " var_name( menu_var[i]) " \"on\" "
      print "ITEM" i "=on"
      print "fi ;;"

    } else if ( menu_type[i] == "input") {
      print "if [ \"@$DIALOG_SUPPORTS_VALUE\" = \"@true\" ]; then"
      print "eval $DIALOG --backtitle \\\'" main_title "\\\' --title \\\'" menu_title " - " menu_text[i] "\\\' --inputbox \\\'Please enter the value for " menu_text[i] "\\\' 9 60 \\\"$ITEM" i "\\\" 2> $TEMP "
      print "else"
      print "eval $DIALOG --backtitle \\\'" main_title "\\\' --title \\\'" menu_title " - " menu_text[i] "\\\' --inputbox \\\'Please enter the value for " menu_text[i] "\\\($ITEM" i "\\\)\\\' 9 60 2> $TEMP "
      print "fi"
      print "RESULT=$?"

      print "if [ $RESULT -eq 0 -o $RESULT -eq 3 -o $RESULT -eq 6 ]; then "
      print "RESULT=`cat $TEMP`"
      print "set_value " var_name( menu_var[i]) " \"$RESULT\""
      print "ITEM" i "=\"$RESULT\""
      print "fi"
      print ";;"

    } else if ( menu_type[i] == "list") {
      print "set_value " var_name( menu_var[i]) " \"" menu_data[i] "\" "
      print "eval ITEM$LIST_" menu_var[i] "=off"
      print "ITEM" i "=on"
      print "LIST_" menu_var[i] "=" i
      print ";;"

    } else if ( menu_type[i] == "text") {
      print ";;"

    }
  }
  if (menu_class == "template") {
    print "-1)"
    print "set_value " var_name(template_deleted) " \"on\""
    print "FINISHED=1"
    print ";;"
  }

  print "esac" 

  print "elif [ $RESULT -eq 2 ]"
  print "then"
  print "$DIALOG --backtitle \'Missing Help\' --msgbox \'Sorry: The help system is not yet written.\' 8 60 "
  print "else"
  print "FINISHED=1"
  print "fi"
}

function write_menu_menu_footer () {
  print "done"
}

function write_menu_exit () {
  if (menu_class == "menu") {
    if ( menu_exit != "" ) {
      print menu_exit " || $DIALOG --backtitle \'Exit Function Error\' --msgbox \'The exit function " menu_exit " appears to be missing or has been aborted.\' 8 60 "

    }
  }
}


function write_menu_function_footer () {
  print "}"
}

function write_menu (  line_length, i, line, list, list_item) {
  # Write out the header
  write_menu_function_header()

  # Initialise Values
  for (i = 0; i < menu_items; i++) {
    if ( menu_type[i] == "boolean") {
      i = write_menu_boolean_init(i)

    } else if ( menu_type[i] == "input") {
      i = write_menu_input_init(i)

    } else if ( menu_type[i] == "list") {
      i = write_menu_list_init(i)

    } else if ( menu_type[i] == "submenu") {
      i = write_menu_submenu_init(i)

    } else if ( menu_type[i] == "text") {
      i = write_menu_text_init(i)

    }
  }

  # Create Menu ...
  write_menu_menu_header()

  for (i = 0; i < menu_items; i++) {

    if (menu_type[i] == "submenu") {
      i = write_menu_entry_submenu(i)

    } else if (menu_type[i] == "boolean") {
      i = write_menu_entry_boolean(i)

    } else if (menu_type[i] == "input") {
      i = write_menu_entry_input(i)

    } else if (menu_type[i] == "list") {
      i = write_menu_entry_list(i)

    } else if (menu_type[i] == "text") {
      i = write_menu_entry_text(i)

    }

  }

  # Do Menu ...
  write_menu_menu()

  # Handle Results ...
  write_menu_action()

  write_menu_menu_footer()

  write_menu_exit()

  write_menu_function_footer()
}


function var_name (  base) {
  if (menu_class == "template" ) {
    return base "_${TEMPLATE}"

  } else {
    return base

  }
}

function write_template () {
  print "handle_" menu_name " () {"
  print "local FINISHED=0 CURRENT RESULT=0 DATA NUM_ITEMS HEIGHT COUNT"
  print "local TEXT TEMPLATE_SIZE DELETED"

  print "if [ \"@$DIALOG_SUPPORTS_CURRENT\" = \"@true\" ]; then"
  print "CURRENT=0"
  print "fi"

  print "while [ $FINISHED -ne 1 ]"
  print "do"
  print "MENU_STRING=\"\""
  print "NUM_ITEMS=0"

  print "COUNT=0"
  print "get_value TEMPLATE_SIZE " template_counter
  print "while [ $COUNT -lt $TEMPLATE_SIZE ]"
  print "do"
  print "COUNT=$[$COUNT + 1]"
  print "DELETED=\"\""
  print "get_value DELETED " template_deleted "_${COUNT}"
  print "if [ \"@$DELETED\" != \"@on\" ]; then"
  print "TEXT=\"" template_text " $COUNT\""
  print "MENU_STRING=\"$MENU_STRING $COUNT \'$TEXT\' \""
  print "NUM_ITEMS=$[$NUM_ITEMS + 1]"
  print "fi"
  print "done"

  # Always offer "Add ..."
  print "MENU_STRING=\"$MENU_STRING $[$TEMPLATE_SIZE +1] \'Add " escape_string(template_text) "\' \""
  print "NUM_ITEMS=$[$NUM_ITEMS + 1]"

  # Rule of thumb - Allow 8 lines for the decorations on the menu ... the
  # screen size has already been reduced by the size detection code.
  print "if [ $[$NUM_ITEMS + 8] -gt $ROWS ]"
  print "then"
  print "HEIGHT=$ROWS"
  print "NUM_ITEMS=$[$HEIGHT - 8]"
  print "else"
  print "HEIGHT=$[$NUM_ITEMS + 8]"
  print "fi"

  print "eval \"$DIALOG --backtitle \'\"" main_title "\"\' --title \'\"" escape_string(menu_title) "\"\' --menu \'\"" escape_string(template_description) "\"\' $HEIGHT 60 $NUM_ITEMS $CURRENT $MENU_STRING \" 2>$TEMP"

  print "RESULT=$?"

  print "if [ $RESULT -eq 0 -o $RESULT -eq 3 -o $RESULT -eq 6 ]; then "
  print "RESULT=`cat $TEMP`"

  print "if [ \"@$DIALOG_SUPPORTS_CURRENT\" = \"@true\" ]; then"
  print "CURRENT=$RESULT"
  print "fi"

  print "if [ $RESULT -eq $[$TEMPLATE_SIZE + 1] ]; then "
  print "TEMPLATE_SIZE=$[$TEMPLATE_SIZE + 1]"
  print "set_value " template_counter " $TEMPLATE_SIZE"
  print "fi"  

  print "handle_" menu_name "_template $RESULT || $DIALOG --backtitle \'Missing Menu Error\' --msgbox \'The template for " menu_name " appears to be missing.\' 8 60 "

  print "elif [ $RESULT -eq 2 ]"
  print "then"
  print "$DIALOG --backtitle \'Missing Help\' --msgbox \'The help system is not yet written. Please read etc/config.dist for full details of the options.\' 8 60 "
  print "else"
  print "FINISHED=1"
  print "fi"

  print "done"
  print "}"
}
