#! /usr/dt/bin/dtksh

SUNWUTBIN=`pkginfo -r SUNWuto`/SUNWut/bin
SUNWUTETC=`pkginfo -r SUNWutr`/etc/opt/SUNWut
export TEXTDOMAIN="utselect"
export TEXTDOMAINDIR=`pkginfo -r SUNWuto`/SUNWut/lib/locale

DoAccept() {
	server=
	if [ "$remote" = "true" ]
	then
		XmTextFieldGetString tserver $ENTER_TEXT
	else
		tserver=
	fi

	XtGetValues $CHOOSER_LIST selectedItems:SELECT
	if [ -z "$SELECT" -a -n "$tserver" ]
	then
		server=$tserver
	else
		tserver=$(print $SELECT | nawk '{print $1}')

		# Make sure that the selected server is up
		let i=0
		while [ $i -lt $lines ]
		do
			if [ "$tserver" = "${sysname[$i]}" -a \
				"${updown[$i]}" = "U" ]
			then
				server=$tserver
			fi
			let "i = i + 1"
		done
	fi
	if [ -n "$server" ]
	then
		if [ "$server" != $thishost ]
		then
			$SUNWUTBIN/utswitch -h $server
		else
			if [ $mode = "login" ]
			then
				exit
			fi
			XBell $(XtDisplay - $CHOOSER_LIST) 1
		fi
		if [ $exitmode = "yes" ]
		then
			exit
		fi
	else
		XBell $(XtDisplay - $CHOOSER_LIST) 1
	fi
}

EnterFocusIn() {
	XmListDeselectAllItems $CHOOSER_LIST
}

DoCancel() {
	XtPopdown $LOGIN_SHELL
	exit
}

maxwidth() {
	XtGetValues $1 width:WIDTH
	if [ $WIDTH -gt $maxwidth ]
	then
		maxwidth=$WIDTH
	fi
}

MakeEntry() {
	printf "%-16.16s " $1
	if [ $2 -ge 0 ]
	then
		printf ":%-10s " $2
	else
		printf "%-11s " $none_text
	fi
	printf "  "
	if  [ $3 -ge -1 ]
	then
		if [ $4 -ne 0 ]
		then
			printf "$offline_text"
		else
			printf "$up_text"
		fi
	elif [ $3 -eq  -2 ]
	then
		printf "$response_text"
	elif [ $3 -eq -3 ]
	then
		printf "$path_text"
	fi
	printf "\n"
}

LayoutCB() {
	XtGetValues $LOGIN_SHELL x:X y:Y width:WIDTH height:HEIGHT

	XtGetValues $MATTE1 width:WIDTH
	XtGetValues $OK_BUTTON width:BUTWIDTH
	spacing=$(($WIDTH / 3 - $BUTWIDTH))
	XtSetValues $OK_BUTTON leftOffset:$((spacing/2))
	XtSetValues $CLEAR_BUTTON leftOffset:$spacing
	XtSetValues $REFRESH_BUTTON leftOffset:$spacing

	XmListDeleteAllItems $CHOOSER_LIST
	let lines=0

	if [ $mode = "login" ]
	then
		# Wait until auth manager knows about this session
		while [ -n "`$SUNWUTBIN/utswitch -l | grep 'no token'`" ]
		do
			sleep 1
		done
	fi

	updown[1]=N
	$SUNWUTBIN/utswitch -l | sort +2nr | \
		while read sys dpy state offline rest
		do
			if [ $state -le -3 ]
			then
				continue
			fi

			if [ "$offline" = "" ]
			then
				offline=0
			fi

			if [ $offline -eq 0 -o $dpy -ge 0 ]
			then
				updown[$lines]=U
			else
				updown[$lines]=N
			fi
			sysname[$lines]=$sys
			dpys[$lines]=$dpy
			states[$lines]=$state

			if [ $sys = $thishost ]
			then
				let "selected = lines + 1"
			fi

			XmListAddItemUnselected $CHOOSER_LIST 0 \
				"$(MakeEntry $sys $dpy $state $offline)"

			let "lines = lines + 1"
		done

	# Pass through if there's only one choice, and remote = false
	if [ $mode = "login" -a $lines -le 1 -a $remote = "false" ]
	then
		exit
	fi

	if [ $lines -ge 2 -a $mode = "normal" -a ${updown[1]} = "U" ]
	then
		selected=2
	fi

	XmListSelectPos $CHOOSER_LIST $selected False
}

maxwidth=0
thishost=`hostname`

# Set mode for being run by login
mode=normal
exitmode=no
remote=`sed -n '/^remoteSelect=/s///p' $SUNWUTETC/auth.props`
while getopts LXRS ARGNAME 2>/dev/null
do
    case $ARGNAME in
      X)  exitmode=yes;;
      L)  mode=login
	  /usr/openwin/bin/xsetroot -cursor_name left_ptr;;
      R)  remote=true;;
      S)  remote=false;;
      *)  printf "`gettext 'Error: arguments not recognized:'` %s\n" "$*" 1>&2
	  exit 1;;
    esac
done

# Make sure this is a Sunray session
sidhost=`/usr/openwin/bin/xprop -root _SUN_CORONA_SESSION 2>/dev/null |
	sed -n 's/.* "\([^:]*\):.*/\1/p'`
if [ -z "$sidhost" -o "$sidhost" != $thishost ]
then
	#print -u2 "Error: not on Sunray terminal"
	printf "`gettext 'Error: not on Sunray terminal'`\n" 1>&2
	exit 1
fi

if [ "$mode" = "login" ]
then
	d=`echo $DISPLAY | sed -n '/.*:\([0-9][0-9]*\).*/s//\1/p'`
	if [ -r /var/dt/sdtlogin/lastlang_$d ]
	then
		export LANG=`cat /var/dt/sdtlogin/lastlang_$d`
	fi
fi

# Japanese and Chinese locales don't work with fixed fonts
LANG_BASE=`echo $LANG | sed 's/^\(..\).*/\1/'`
case $LANG_BASE in
	ja | zh | ko)	FONTLIST="" ;;
	*)		FONTLIST=fontList:fixed ;;
esac
LC_ALL=

xrdb -merge /usr/dt/config/$LANG/Xresources
xrdb -merge /usr/dt/config/$LANG/sys.font

# localized variables
title_text="`gettext 'Server Selection'`"
header_text="`gettext 'Server          Session         Status'`"
ok_text="`gettext OK`"
cancel_text="`gettext Cancel`"
refresh_text="`gettext Refresh`"
none_text="`gettext None`"
up_text="`gettext '   Up      '`"
response_text="`gettext 'No Response'`"
path_text="`gettext '  No path  '`"
offline_text="`gettext ' Offline   '`"
enter_text="`gettext 'Enter server: '`"

. /usr/dt/lib/dtksh/DtFuncs.dtsh
XtInitialize TOPLEVEL serverSelect ServerSelect "Server Select" "$@"

XtCreatePopupShell LOGIN_SHELL "$thishost" TransientShell $TOPLEVEL \
	allowShellResize:True
XtAddCallback $LOGIN_SHELL popupCallback LayoutCB

XtCreateManagedWidget TABLE table XmDrawingArea $LOGIN_SHELL #background:black

if [ "$remote" = "true" ]
then
	ht=250
else
	ht=200
fi
wd=300

XmCreateForm MATTE $TABLE matte height:$ht width:$wd
XtManageChild $MATTE

XmCreateFrame MATTE_FRAME $MATTE matte_frame \
	shadowThickness:2 \
	topAttachment:ATTACH_FORM \
	bottomAttachment:ATTACH_FORM \
	leftAttachment:ATTACH_FORM \
	rightAttachment:ATTACH_FORM
#	shadowType:SHADOW_OUT
XtManageChild $MATTE_FRAME

XmCreateForm MATTE1 $MATTE_FRAME matte1
XtManageChild $MATTE1

XmCreateLabel GREETING $MATTE1 "greeting" \
	labelString:"$title_text" \
	topAttachment:ATTACH_FORM \
	topOffset:10 \
	leftAttachment:ATTACH_FORM \
	rightAttachment:ATTACH_FORM \
	alignment:ALIGNMENT_CENTER \
	traversalOn:False
XtManageChild $GREETING

XmCreateLabelGadget LIST_HEAD $MATTE1 "list_head" \
	traversalOn:False \
	topAttachment:ATTACH_WIDGET \
	topWidget:$GREETING \
	topOffset:10 \
	leftAttachment:ATTACH_FORM \
	leftOffset:13 \
	$FONTLIST
XtSetValues $LIST_HEAD labelString:"$header_text"
XtManageChild $LIST_HEAD

XmCreatePushButtonGadget OK_BUTTON $MATTE1 "ok_button" \
	bottomAttachment:ATTACH_POSITION bottomPosition:95 \
	traversalOn:True labelString:$ok_text \
	leftAttachment:ATTACH_FORM 
XtAddCallback $OK_BUTTON activateCallback DoAccept
XtManageChild $OK_BUTTON
maxwidth $OK_BUTTON

XmCreatePushButtonGadget CLEAR_BUTTON $MATTE1 "clear_button" \
	bottomAttachment:ATTACH_POSITION bottomPosition:95 \
	traversalOn:True leftAttachment:ATTACH_WIDGET leftWidget:$OK_BUTTON \
	labelString:$cancel_text
XtAddCallback $CLEAR_BUTTON activateCallback DoCancel
XtManageChild $CLEAR_BUTTON
maxwidth $CLEAR_BUTTON

XmCreatePushButtonGadget REFRESH_BUTTON $MATTE1 "refresh_button" \
	bottomAttachment:ATTACH_POSITION bottomPosition:95 \
	traversalOn:True leftAttachment:ATTACH_WIDGET leftWidget:$CLEAR_BUTTON \
	labelString:$refresh_text
XtAddCallback $REFRESH_BUTTON activateCallback LayoutCB
XtManageChild $REFRESH_BUTTON
maxwidth $REFRESH_BUTTON

XtSetValues $OK_BUTTON width:$maxwidth recomputeSize:False
XtSetValues $CLEAR_BUTTON width:$maxwidth recomputeSize:False

if [ "$remote" = "true" ]
then
	XmCreateLabel ENTER_LABEL $MATTE1 "enter_label" \
		traversalOn:False \
		bottomAttachment:ATTACH_WIDGET \
		bottomWidget:$OK_BUTTON \
		bottomOffset:12 \
		leftAttachment:ATTACH_FORM \
		leftOffset:13
	XtSetValues $ENTER_LABEL labelString:"$enter_text"
	XtManageChild $ENTER_LABEL

	XmCreateTextField ENTER_TEXT $MATTE1 "enter_text" \
		traversalOn:True \
		bottomAttachment:ATTACH_WIDGET \
		bottomWidget:$OK_BUTTON \
		bottomOffset:10 \
		leftAttachment:ATTACH_WIDGET \
		leftWidget:$ENTER_LABEL \
		$FONTLIST
	XtAddCallback $ENTER_TEXT focusCallback EnterFocusIn
	XtAddCallback $ENTER_TEXT activateCallback DoAccept
	XtManageChild $ENTER_TEXT
	under_choose=$ENTER_LABEL
else
	under_choose=$OK_BUTTON
fi

XmCreateScrolledList CHOOSER_LIST $MATTE1 "chooser_list" \
	leftAttachment:ATTACH_FORM \
	leftOffset:10 \
	rightAttachment:ATTACH_FORM \
	rightOffset:10 \
	topAttachment:ATTACH_WIDGET \
	topWidget:$LIST_HEAD \
	topOffset:1 \
	bottomAttachment:ATTACH_WIDGET \
	bottomWidget:$under_choose \
	bottomOffset:10 \
	listSizePolicy:CONSTANT \
	scrollBarDisplayPolicy:AS_NEEDED \
	$FONTLIST
XtAddCallback $CHOOSER_LIST defaultActionCallback DoAccept
XtManageChild $CHOOSER_LIST

XWidthOfScreen RW $(XtScreen - $LOGIN_SHELL)
XHeightOfScreen RH $(XtScreen - $LOGIN_SHELL)
if [ "$mode" = "login" ]
then
	let "x = ($RW - $wd) / 2"
	let "y = ($RH - $ht) / 2"
else
	let "x = ($RW - $wd - 25)"
	y=5
fi

XtSetValues $LOGIN_SHELL x:$x y:$y
XtRealizeWidget $LOGIN_SHELL
XtPopup $LOGIN_SHELL GrabNone
XtMainLoop
