#!/bin/bash

# Conmen for Linux, Console menu scripts. (cmfunk).
# Copyright (C) 1999  Maxim Heijndijk

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

# Email: cchq@wanadoo.nl"

SUBVER=020804
VERSION=0.3.$SUBVER
GLOBALRC="/etc/conmen/cmrc"
USERRC="${HOME}/.conmen/cmrc"
TXTTMP=/tmp/txtbox.tmp.$$
CMDTMP=/tmp/exec_cmd.tmp.$$
CONLIBDIR=/usr/lib/conmen
CONSTATEDIR=/var/lib/conmen
DBFILE=/etc/conmen/conmen.db
#[ -z "${DISPLAY}" ] && SIZE="0 0 0" || SIZE="0 0 13"
SIZE="0 0 0"
#[ -z "${DISPLAY}" ] && CHKSIZE="0 0 0" || CHKSIZE="0 0 5"
CHKSIZE="0 0 0"
[ ! -z "${DISPLAY}" ] && XOPTS="-wrap --fixed-font --no-tags --center"
[ ! -z "${DISPLAY}" ] && CHKOPTS="-wrap --fixed-font --center"
[ -d "${HOME}/.conmen/cmorig" ] || mkdir -p "${HOME}/.conmen/cmorig"

trap 'forcequit' INT
trap 'forcequit' TERM
#trap 'forcequit' KILL

function forcequit {
    msgbox "Aborting ConMen and cleaning up temporary files"
    [ -f "$TXTTMP" ] && rm -f $TXTTMP
    [ -f "$CMDTMP" ] && rm -f $CMDTMP
    [ -f "$CMDTMP" ] && rm -f $CMDTMP
    [ -f "/tmp/$MNAME.tmp.$$" ] && rm -f /tmp/$MNAME.tmp.$$
    [ -f "/tmp/checklist.tmp.$$" ] && rm -f /tmp/checklist.tmp.$$
    [ -f "/tmp/radlist.tmp.$$" ] && rm -f /tmp/radlist.tmp.$$
    [ -f "/tmp/inputbox.tmp.$$" ] && rm -f /tmp/inputbox.tmp.$$
    exit 1
}

function if_no_wrapper {
    if [ ! -z "$DISPLAY" -a ! -x "/usr/bin/Xdialog.wrapper" ]; then
	$XTRM -e bash -c 'echo "If you want to run this in X, you have
to install the wrapper that comes
with the Xdialog package.

Hit enter." && read'
    fi
}

function saverc_user {
    [ -d $HOME/.conmen ] || mkdir $HOME/.conmen
    backup_conf --quiet $USERRC
    [ ! -z "$EXT" ] && echo EXT="'"${EXT}"'" > $USERRC
    [ ! -z "$COPY" ] && echo COPY="'"${COPY}"'" >> $USERRC
    [ ! -z "$STEREO" ] && echo STEREO="'"${STEREO}"'" >> $USERRC
    [ ! -z "$SMODE" ] && echo SMODE="'"${SMODE}"'" >> $USERRC
    [ ! -z "$BITRATE" ] && echo BITRATE="'"${BITRATE}"'" >> $USERRC
    [ ! -z "$TMPRATE" ] && echo TMPRATE="'"${TMPRATE}"'" >> $USERRC
    [ ! -z "$RMSRC" ] && echo RMSRC="'"${RMSRC}"'" >> $USERRC
    [ -d "$WDIR" ] && echo WDIR="'"${WDIR}"'" >> $USERRC
    [ -e "$INFILE" ] && echo INFILE="'"${INFILE}"'" >> $USERRC
    [ -d "$INDIR" ] && echo INDIR="'"${INDIR}"'" >> $USERRC
    [ -d "$OUTDIR" ] && echo OUTDIR="'"${OUTDIR}"'" >> $USERRC
    [ ! -z "$OUTFILE" ] && echo OUTFILE="'"${OUTFILE}"'" >> $USERRC
    [ -e "$CDDEVICE" ] && echo CDDEVICE="'"${CDDEVICE}"'" >> $USERRC
    [ -d "$CDDRIVE" ] && echo CDDRIVE="'"${CDDRIVE}"'" >> $USERRC
    [ ! -z "$LSOPT" ] && echo LSOPT="'"${LSOPT}"'" >> $USERRC
    [ -b "$HDDEVICE" ] && echo HDDEVICE="'"${HDDEVICE}"'" >> $USERRC
    [ ! -z "$KERNEL_VERSION" ] && echo KERNEL_VERSION="'"${KERNEL_VERSION}"'" >> $USERRC
    [ ! -z "$SOURCEDIRNAME" ] && echo SOURCEDIRNAME="'"${SOURCEDIRNAME}"'" >> $USERRC
    [ ! -z "$ID3" ] && echo ID3="'"${ID3}"'" >> $USERRC
    [ ! -z "$ID3AFTER" ] && echo ID3AFTER="'"${ID3AFTER}"'" >> $USERRC
    [ ! -z "$ID3NOW" ] && echo ID3NOW="'"${ID3NOW}"'" >> $USERRC
    [ ! -z "$COPYTAG" ] && echo COPYTAG="'"${COPYTAG}"'" >> $USERRC
    [ ! -z "$ARTIST" ] && echo ARTIST="'"${ARTIST}"'" >> $USERRC
    [ ! -z "$ALBUM" ] && echo ALBUM="'"${ALBUM}"'" >> $USERRC
    [ ! -z "$YEAR" ] && echo YEAR="'"${YEAR}"'" >> $USERRC
    [ ! -z "$GENRE" ] && echo GENRE="'"${GENRE}"'" >> $USERRC
    [ ! -z "$CMNT" ] && echo CMNT="'"${CMNT}"'" >> $USERRC
    [ ! -z "$GEOM" ] && echo GEOM="'"${GEOM}"'" >> $USERRC
    [ ! -z "$QUAL" ] && echo QUAL="'"${QUAL}"'" >> $USERRC
    [ ! -z "$NORM" ] && echo NORM="'"${NORM}"'" >> $USERRC
    [ ! -z "$VERB" ] && echo VERB="'"${VERB}"'" >> $USERRC
    [ ! -z "$BORD" ] && echo BORD="'"${BORD}"'" >> $USERRC
    [ ! -z "$BSIZE" ] && echo BSIZE="'"${BSIZE}"'" >> $USERRC
    [ ! -z "$BCOL" ] && echo BCOL="'"${BCOL}"'" >> $USERRC
    [ ! -z "$RSF" ] && echo RSF="'"${RSF}"'" >> $USERRC
    [ ! -z "$TMPRSF" ] && echo TMPRSF="'"${TMPRSF}"'" >> $USERRC
    [ ! -z "$SRSF" ] && echo SRSF="'"${SRSF}"'" >> $USERRC
    echo -e HELP="'"${HELP:=on}"'" >> $USERRC
#    [ ! -z "$" ] && echo ="'"${}"'" >> $USERRC
#    [ ! -z "$" ] && echo ="'"${}"'" >> $USERRC

}

# Dialogboxes
function menubox {

    RETVAL=
    choice=

    if ${DIALOG} --backtitle "ConMen ${VERSION}. Current script is: \"$MNAME\"" \
		 $XOPTS --menu "${MENU}" ${SIZE} "$@" 2> /tmp/$MNAME.tmp.$$; then

	choice=`cat /tmp/$MNAME.tmp.$$`
	RETVAL=$?
	${MENUCHOICES:=menuchoices}

    fi

    rm -f /tmp/$MNAME.tmp.$$ 2> /dev/null
}

function inputbox {

    INPUT=
    RETVAL=

    if ${DIALOG} --inputbox "$1" 0 0 2> /tmp/inputbox.tmp.$$; then

	INPUT=`cat /tmp/inputbox.tmp.$$`
	RETVAL=$?

    fi

    rm -f /tmp/inputbox.tmp.$$ 2> /dev/null
}

function checkbox {

    RETVAL=

    if ${DIALOG} ${CHKOPTS} --checklist "${CHK}" ${CHKSIZE} "$@" \
	2> /tmp/checklist.tmp.$$; then

	if [ -z "${DISPLAY}" ]; then

	    CHOICES=`cat /tmp/checklist.tmp.$$ | sed -e "s|\"||g"`

	else

	    CHOICES=`cat /tmp/checklist.tmp.$$ | sed -e "s|\/| |g"`

	fi

	RETVAL=$?
	clear; ${INPUT}

    fi

    rm -f /tmp/checklist.tmp.$$ ${TMPCHKLST} 2> /dev/null
}

function radiolist {

    RETVAL=

    if ${DIALOG} ${CHKOPTS} --radiolist "${RAD}" ${CHKSIZE} "$@" \
	2> /tmp/radlist.tmp.$$; then

	CHOICE=`cat /tmp/radlist.tmp.$$`
	RETVAL=$?

	clear; $INPUT

    fi

    rm -f /tmp/radlist.tmp.$$ $TMPRADLST 2> /dev/null
}

function yesnobox {

    YNRETVAL=

    ${DIALOG} --yesno "$1" 0 0

    YNRETVAL=$?
}

function msgbox {

    ${DIALOG} --msgbox "$1" 0 0

}

function infobox {

    $DIALOG --no-buttons --infobox "$1" 250x100 2000

}

function textbox {

    if [ -z "$DISPLAY" ]; then

	$DIALOG --textbox "$1" 0 0

    else

#	$DIALOG $XOPTS --no-cancel --textbox "$1" 580x200
	$DIALOG $XOPTS --no-cancel --textbox "$1" 0 0

    fi

    rm -f $TXTTMP
}

# Choose working directory
function choose_wdir {

    clear
    unset OK
    YNRETVAL=0
    WDIR=${WDIR:=/}
    cd $WDIR

    if which kcdscr > /dev/null 2>&1 ;then

	if [ -z "$DISPLAY" ]; then

	    yesnobox "Rescan directory tree ?"

	    [ "$YNRETVAL" = "0" ] && . kcdscr -rf

	    YNRETVAL=0

	    . kcdscr
	    WDIR=`pwd`

	else

	    WDIR=`Xdialog --stdout --title "Choose a directory" --dselect ${WDIR} 0 0`

	    case $? in
		0) cd $WDIR;;
		1) exit 0;;
		255) exit 0;;
	    esac

	fi

	if [ ! -z "$EXT" ]; then

	    if ls -ARsh $WDIR/*.$EXT 2> /dev/null | grep -q ".$EXT$" ; then

		echo -e "`du -chSs *.$EXT`" > $TXTTMP
		textbox $TXTTMP

	    else

	    	yesnobox "Warning: no \"$EXT\" file(s) found. Again ?"

		if [ "$YNRETVAL" = "0" ]; then

		    #WDIR=$WDIR
		    choose_wdir

		fi
	    fi	    	    
	fi

    else

	if [ -z "$DISPLAY" ]; then

	    inputbox "Specify working directory or hit enter for\n[$WDIR]"

	    if [ "$RETVAL" != "0" ]; then

		YNRETVAL=$RETVAL
		return

	    else

		YNRETVAL=$RETVAL
		WDIR=${INPUT}

	    fi

	    if [ ! -d ${INPUT:=$WDIR} ]; then

		yesnobox "$INPUT does not exist. Create ?"

		if [ "$YNRETVAL" = "0" ]; then
		
		    mkdir -p $WDIR && msgbox "$WDIR created"
		
		fi
	    
	    fi

	else

	    WDIR=`Xdialog --stdout --title "Choose a directory" --dselect ${WDIR} 0 0`

	    case $? in
		0) cd $WDIR;;
		1) exit 0;;
		255) exit 0;;
	    esac

	fi

	if [ -d "${INPUT:=$WDIR}" -a ! -z "$EXT" ]; then

	    if ls -ARsh $WDIR/*.$EXT 2> /dev/null | grep -q ".$EXT$" ; then

		echo -e "`du -chSs *.$EXT`" > $TXTTMP
		textbox $TXTTMP

	    else

	    	yesnobox "Warning: no \"$EXT\" file(s) found. Again ?"

		if [ "$YNRETVAL" = "0" ]; then

		    #WDIR=$INPUT
		    choose_wdir

		fi
	    fi
	fi

	[ -d "$INPUT" ] && WDIR=$INPUT

    fi

    WDIR=`echo "$WDIR" | sed -e "s|\/$||"`

    if [ -d $WDIR ]; then

	saverc
	saverc_user

    fi
}

function select_inputfile {

    YNRETVAL=0

    inputbox "Specify inputfile or hit enter for [$INFILE]"

    if [ "$RETVAL" != "0" ]; then
	unset YNRETVAL
	return
    fi

    if [ ! -f ${INPUT:=$INFILE} ]; then

	yesnobox "[$INPUT] does not exist, try again ?"

	[ "$YNRETVAL" = "0" ] && select_inputfile

	if [ -f ${INPUT:=$INFILE} ]; then
	    INFILE=$INPUT
	    saverc
	    saverc_user
	fi

    else

	INFILE=$INPUT
	saverc
	saverc_user

    fi
}

function select_inputdir {

    YNRETVAL=0

    inputbox "Specify input directory or hit enter for [$INDIR]"

    if [ "$RETVAL" != "0" ]; then
	unset YNRETVAL
	return
    fi

    if [ ! -d ${INPUT:=$INDIR} ]; then

	yesnobox "[$INPUT] does not exist, try again ?"

	[ "$YNRETVAL" = "0" ] && select_inputdir

	if [ -f ${INPUT:=$INDIR} ]; then
	    INDIR=$INPUT
	    saverc
	    saverc_user
	fi

    else

	INDIR=$INPUT
	saverc
	saverc_user

    fi
}

function select_outputdir {

    YNRETVAL=0

    inputbox "Specify output directory or hit enter for [$OUTDIR], if the directory does not exist it will be created"

    if [ "$RETVAL" != "0" ]; then
	unset YNRETVAL
	return
    fi

    [ -d ${INPUT:=$OUTDIR} ] || mkdir -p $INPUT

    OUTDIR=${INPUT:=.}
    saverc
    saverc_user
}

function select_outputfile {

    YNRETVAL=0

    inputbox "Specify output file or hit enter for [$OUTFILE]"

    if [ "$RETVAL" != "0" ]; then
	unset YNRETVAL
	return
    fi

    OUTFILE=${INPUT:=$OUTFILE}
    saverc
    saverc_user
}

function set_cddevice {
    case $CHOICE in
	A) CDDEVICE=$CDROM;;
	B) CDDEVICE=$CDRW;;
    esac
}

function select_device {
    RAD="Select Device"
    INPUT=set_cddevice
    STRING=("A" "CD-ROM" on \
	    "B" "CD-RW" off)
	    radiolist "${STRING[@]}"
    saverc
    saverc_user
}

function exec_command {

    [ -z "$EXEC_GEOM" ] && EXEC_GEOM="580x200"

    if [ "$1" = "--xterm" ] ; then

	shift

	if [ -z "${DISPLAY}" ]; then

	    $1 ; hit_enter

	else

	    if [ "$XTRM" = "xterm" ]; then

		$XTRM -e bash -c "$1 ; echo -e \"\nHit enter to exit\" ; read"

	    fi

	    if [ "$XTRM" = "rxvt" ]; then

		msgbox "Rxvt is not supported. Change \"XTRM\" in \"/etc/conmen/cmrc\" to \"xterm\" or \"gnome-terminal\""

	    fi

	    if [ "$XTRM" = "gnome-terminal" ]; then

		$XTRM -x bash -c "$1 ; echo -e \"\nHit enter to exit\" ; read"

	    fi

	fi

    else

	if [ -z "${DISPLAY}" ]; then

	    $1 ; hit_enter

	else

	    $1 > ${CMDTMP} 2>&1 &
	    Xdialog --title "Command Output" \
		    $XOPTS \
		    --no-cancel \
		    --tailbox ${CMDTMP} ${EXEC_GEOM}

	fi

    fi

    rm -f ${CMDTMP}
}

function backup_conf {
    case $1 in
	--force) local DEST=$HOME/.conmen/cmorig/`basename $2`.cmorig
		 if [ -f "$2" ]; then
		    cp -f "$2" "$DEST"
		    msgbox "Backing up $2 to $DEST"
		 fi;;

	--quiet) local DEST=$HOME/.conmen/cmorig/`basename $2`.cmorig
		 [ -f "$2" ] && cp "$2" "$DEST";;

	*)	 local DEST=$HOME/.conmen/cmorig/`basename $1`.cmorig
		 if [ ! -f "$DEST" -a -f "$1" ]; then
		    cp -f "$1" "$DEST"
		    msgbox "Backing up $1 to $DEST"
		 fi;;
    esac
}

function restore_conf {
    local DEST=$HOME/.conmen/cmorig/`basename $1`.cmorig
    [ -f "$1" ] && cp -f $DEST $1
}


function hit_enter {
    if [ -z "$DISPLAY" ]  ; then
	if [ "$?" = "0" ]; then
	    echo -e "\033[1;33mHit enter to continue\033[0m"
	else
	    echo -e "\033[1;33mHit enter to continue\033[0m"
	fi
	read
    else
#	[ "$?" = "0" ] && msgbox "Succeeded" || msgbox "Failed"
	if [ "$1" != "--no-info" ]; then
	    infobox "Done !"
	fi
    fi
}

function select_harddisk {

    YNRETVAL=0

    inputbox "Select device (/dev/hd#) or hit enter for\n[${HDDEVICE}]"

    if [ "$RETVAL" != "0" ]; then
	unset YNRETVAL
	return
    fi

    HDDEVICE=${INPUT:=$HDDEVICE}

    saverc
    saverc_user
}
