#!/bin/sh
# Copyright 2000,2004 Sun Microsystems, Inc. All Rights Reserved
# @(#)utselect.tcl	1.23 04/10/19
# \
	exec /usr/bin/wish -f $0 $* #& exit


set SUNWuto /etc/opt/SUNWut/basedir
set SUNWUTETC /etc/opt/SUNWut/
set path "$SUNWuto/bin"
set env(TEXTDOMAIN) utselect
set env(TEXTDOMAINDIR) $SUNWuto/lib/locale

# workaround/fix for 5066563, dependency on LANG
if ![info exists env(LANG)] {
	if [info exists env(RC_LANG)] {
		set env(LANG) $env(RC_LANG) ; # RC_LANG on SuSe only
	} else {
		set env(LANG) "C"
	}
}

# localized variables
set header_text "[exec gettext "Server Selection"]"
set title_text "[exec gettext "Server          Session         Status"]"
set ok_text "[exec gettext OK]"
set cancel_text "[exec gettext Cancel]"
set refresh_text "[exec gettext Refresh]"
set none_text "[exec gettext None]"
set up_text "[exec gettext "   Up      "]"
set offline_text "[exec gettext " Offline   "]"
set response_text "[exec gettext "No Response"]"
set path_text "[exec gettext "  No path  "]"
set enter_text "[exec gettext "Enter server: "]"
set cr_text "[exec gettext {Copyright %s Sun Microsystems, Inc.\nAll rights reserved.}]"
set cr_text [format $cr_text "1999 - 2004"]

set thishost [exec hostname]

# Japanese and Chinese locales don't work with fixed fonts
set LANG_BASE [string range $env(LANG) 0 1]
switch -regexp $LANG_BASE {
	ja|zh	{set fixedfont 0}
	.*	{set fixedfont 1}
}

set mode normal
catch "exec sed -n /^remoteSelect=/s///p $SUNWUTETC/auth.props" remote
set exitmode no
set ix 0
while { $ix < $argc } {
	set a [lindex $argv $ix]
	switch -- "$a" {
	    -X { set exitmode yes }
	    -L { set mode login }
	    -R { set remote true }
	    -S { set remote false }
	    default {
		puts "[exec gettext "Error: arguments not recognized:"] $a"
		exit 1
	    }
	}
	set ix [expr $ix + 1]
}

catch "exec /opt/SUNWut/lib/utxprop -s 2>/dev/null" sessionid
set sidhost ""
regexp {([^:]*):} "$sessionid" dummy sidhost
if {"$sidhost" == "" || "$sidhost" != $thishost} {
	puts "[exec gettext "Error: cannot select from a non-Sun Ray or remote login session"]"
	exit 1
}

proc DoAccept {} {
	global thishost mode
	global path
	global entryname
	global lbname
	global exitmode
	global serverList

	set curItem [$lbname curselection]
	# we expect length of 1 or 0, as we are in single selectmode
	if {[llength $curItem] == 1} {
		set server [lindex $serverList [lindex $curItem 0]]
	} else {
		set server $entryname
	}

	if {$server != ""} {
		if {$server != $thishost} {
			exec $path/utswitch -h $server
		} else {
			if {$mode == "login"} {
				exit
			}
			puts \007
		}
		if {$exitmode == "yes"} {
			exit
		}
	} else {
		bell
	}
}

proc DoCancel {} {
	exit 0
}

set lbhead .w.head
set lbtitle .w.title
set lbframe .w.slist
set lbname .w.slist.l
set lbscroll .w.slist.s
set ok_b .w.s.ok
set can_b .w.s.can
set ref_b .w.s.ref
set entitle .w.e.title
set enentry .w.e.entry

proc window_init {} {
	global lbhead lbtitle lbframe lbname lbscroll
	global entitle enentry
	global ok_b can_b ref_b
	global header_text title_text ok_text cancel_text refresh_text
	global none_text up_text response_text path_text enter_text thishost
	global top
	global fixedfont
	global entryname
	global mode
	global remote
	global cr_text

	frame .w -cursor left_ptr -relief groove -borderwidth 4
	frame .w.e
	frame .w.s
	frame $lbframe

	label $lbhead -anchor center -text "$header_text" -pady 0
	if {$fixedfont} {
		label $lbtitle -font fixed -width 48 -anchor w \
			-text "$title_text" -pady 0
		listbox $lbname -height 5 -width 45 -font fixed \
			-selectmode single -yscrollcommand "$lbscroll set"
	} else {
		label $lbtitle -width 48 -anchor w -text "$title_text" -pady 0
		listbox $lbname -height 5 -width 45 \
			-selectmode single -yscrollcommand "$lbscroll set"
	}
	scrollbar $lbscroll -command "$lbname yview"
	pack $lbname $lbscroll -side left -in $lbframe -fill y
	bind $lbname <Double-Button-1> { DoAccept }
	bind $lbname <Return> { puts "Return" }
	bind $lbname <Button-1> { focus $lbname }

	button $ok_b -text "$ok_text" -command { DoAccept }
	button $can_b -text "$cancel_text" -command { DoCancel }
	button $ref_b -text "$refresh_text" -command { LayoutCB }

	pack $ok_b $can_b $ref_b -side left -in .w.s -padx 4

	if { $remote == "true" } {
		label $entitle -text "$enter_text"
		entry $enentry -textvariable entryname
		bind $enentry <FocusIn> { selection clear }
		bind $enentry <Return> { DoAccept }
		pack $entitle $enentry -side left -in .w.e -padx 10
		pack $lbhead $lbtitle $lbframe .w.e .w.s -side top -in .w \
			-pady 4 -padx 10
	} else {
		pack $lbhead $lbtitle $lbframe .w.s -side top -in .w \
			-pady 4 -padx 10
	}

	# Display a Copyright notice
	# text seems to have a '\' and then 'n' - replace
	regsub -all {\\n} $cr_text "\n" lText
	set lWidth [string length [lindex [split $lText "\n"] 0]]
	set lFont "-adobe-helvetica-medium-r-normal-*-12-*-*-*-*-*-*"
	label .w.crLabel -text $lText -width $lWidth -font $lFont -bd 0
	pack .w.crLabel -side top
	after 2000 {pack forget .w.crLabel}

	pack .w
}

proc waitforut {} {
	global path SUNWuto

	while {1} {
		set lf [open "|$path/utswitch -l" r]
		if {[regexp "no token" "[gets $lf]"]} {
			close $lf
			exec $SUNWuto/lib/utaction -e -i -c "true"
		} else {
			return
		}
	}
}

proc LayoutCB {} {
	global lbname
	global thishost
	global path
	global mode
	global none_text up_text response_text path_text thishost
	global offline_text
	global entryname
	global SUNWuto
	global serverList
	global env

	$lbname delete 0 end
	set entryname ""
	set serverList [list]

	#
	# Set LC_ALL=C before doing the sort operation
	# 
	if [info exists env(LC_ALL)] {
		set tmpLC_ALL $env(LC_ALL)
	}
	set env(LC_ALL) "C"

	set lf [open "|$path/utswitch -l | sort +2nr" r]

	if [info exists tmpLC_ALL] {
		set env(LC_ALL) $tmpLC_ALL
	} else {
		unset env(LC_ALL)
	}

	while {[gets $lf line] >= 0} {
		if {[regexp "no token" "$line"]} {
			close $lf
			exec $SUNWuto/bin/utaction -e -i -c "true"
			set lf [open "|$path/utswitch -l" r]
			continue
		}
		set sys [lindex $line 0]
		set dpy [lindex $line 1]
		set state [lindex $line 2]
		set offline [lindex $line 3]
		if {$state <= -3} {
			continue
		}
		if {$offline == ""} {
			set offline 0
		}

		if {$dpy >= 0} {
			set t2 [format ":%-10s " $dpy]
			if {$thishost == $sys}  {
				set lbitem [$lbname size]
			}
		} else {
			set t2 [format "%-11s " $none_text]
		}
		if {$state >= -1} {
			if {$offline != 0} {
				set t3 "$offline_text"
			} else {
				set t3 "$up_text"
			}
		} elseif {$state == -2} {
			set t3 "$response_text"
		} elseif {$state == -3} {
			set t3 "$path_text"
		}
		set tbline [format "%-16.16s %s %s" $sys "$t2" "$t3"]

		# Keep the untruncated server name around for later
		lappend serverList $sys

		# Append formatted item in the listbox widget
		$lbname insert end $tbline
	}
	close $lf
	if {[$lbname size] >= 2 && $mode == "normal"} {
		$lbname selection set 1
	} else {
		$lbname selection set 0
	}
	after 300000 { LayoutCB }
}

wm title . $thishost
wm iconname . $thishost

window_init
if {$mode == "login"} {
	set x [wm maxsize .]
	set xw [lindex $x 0]
	set xh [lindex $x 1]
	wm geometry . "+[expr $xw / 2 - 150]+[expr $xh / 2 - 100]"
} else {
	wm geometry . -10+10
}
LayoutCB
