#         Portable Batch System (PBS) Software License
# 
# Copyright (c) 1999, MRJ Technology Solutions.
# All rights reserved.
# 
# Acknowledgment: The Portable Batch System Software was originally developed
# as a joint project between the Numerical Aerospace Simulation (NAS) Systems
# Division of NASA Ames Research Center and the National Energy Research
# Supercomputer Center (NERSC) of Lawrence Livermore National Laboratory.
# 
# Redistribution of the Portable Batch System Software and use in source
# and binary forms, with or without modification, are permitted provided
# that the following conditions are met:
# 
# - Redistributions of source code must retain the above copyright and
#   acknowledgment notices, this list of conditions and the following
#   disclaimer.
# 
# - Redistributions in binary form must reproduce the above copyright and 
#   acknowledgment notices, this list of conditions and the following
#   disclaimer in the documentation and/or other materials provided with the
#   distribution.
# 
# - All advertising materials mentioning features or use of this software must
#   display the following acknowledgment:
# 
#   This product includes software developed by NASA Ames Research Center,
#   Lawrence Livermore National Laboratory, and MRJ Technology Solutions.
# 
#         DISCLAIMER OF WARRANTY
# 
# THIS SOFTWARE IS PROVIDED BY MRJ TECHNOLOGY SOLUTIONS ("MRJ") "AS IS" WITHOUT 
# WARRANTY OF ANY KIND, AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
# BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
# FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT ARE EXPRESSLY DISCLAIMED.
# 
# IN NO EVENT, UNLESS REQUIRED BY APPLICABLE LAW, SHALL MRJ, NASA, NOR
# THE U.S. GOVERNMENT BE LIABLE FOR ANY DIRECT DAMAGES WHATSOEVER,
# NOR ANY INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# 
# This license will be governed by the laws of the Commonwealth of Virginia,
# without reference to its choice of law rules.

proc getNextNodeColorInUse {} {
	global canvas

	if {![info exists canvas(nodeColorINUSE_index)]} {
		set canvas(nodeColorINUSE_index) -1
	}

	set newindex [expr ($canvas(nodeColorINUSE_index)+1) % \
				     [llength $canvas(nodeColorINUSEexclusive)]]
	set canvas(nodeColorINUSE_index) $newindex
	set retcolor [lindex $canvas(nodeColorINUSEexclusive) $newindex]
	if {[string compare $retcolor ""] == 0} {
		set retcolor white
	} 

	return $retcolor
}

proc assignNodeColorInUse {job {defcolor ""}} {
	global sysinfo

	set retcolor ""
	if [info exists sysinfo(color,$job)] {
		set retcolor $sysinfo(color,$job)
	} else {

		if {[string compare $defcolor ""] == 0} {
			set retcolor [getNextNodeColorInUse]
		} else {
			set retcolor $defcolor
		}
		set sysinfo(color,$job) $retcolor
	}

	if [info exists sysinfo(colorCnt,$job)] {
		set sysinfo(colorCnt,$job) [expr $sysinfo(colorCnt,$job) + 1]
	} else {
		set sysinfo(colorCnt,$job) 1
	}
	return $retcolor
}

proc unsetNodeColorInUseMapping {} {
	global sysinfo canvas

	foreach s [array names sysinfo] {
		set s_list [split $s ","]
		set head [lindex $s_list 0]

		if {[string compare $head "color"] == 0 || \
		    [string compare $head "colorCnt"] == 0 } {
			unset sysinfo($s)
		}
	}
	set canvas(nodeColorINUSE_index) -1
}

proc colorBarPopulate {startx starty maplist tag} {
	global canvas

	set i 0
	foreach stat $maplist {
		set color [lindex $stat 0]
		set label [lindex $stat 1]

		if {$i == 0} {
			set x1 $startx
		} else {
			set pos [$canvas(colorBarCanvas) bbox $previd]
			set x1 [expr [lindex $pos 2] + $canvas(smallLabelFontWidth)]
		}
		set y1 $starty
		set x2 [expr $x1 + $canvas(smallTextFontWidth)]
		set y2 [expr $y1 + $canvas(smallTextFontHeight)]
		set rid [$canvas(colorBarCanvas) create rect $x1 $y1 $x2 $y2 \
				-fill $color -tags [list $tag all]]
		set pos [$canvas(colorBarCanvas) bbox $rid]
		set x1 [expr [lindex $pos 2] + 2]
		set y1 [lindex $pos 1]
	
		set previd [$canvas(colorBarCanvas) create text $x1 $y1 \
		  		-anchor nw -text "$label" \
				-font $canvas(smallLabelFont) \
				-tags [list $tag all]]
		incr i
	}

} 

proc colorBarCreate {frame_name} {
	global sysinfo canvas

	canvas $frame_name.c -confine 1 \
		-height [expr 2*$canvas(smallLabelFontHeight)] \
		-borderwidth 2 \
		-relief ridge \
	       	-width $canvas(systemMaxWidth) \
		-xscrollcommand [list $frame_name.xscroll set] \
		-scrollregion [list 0 0 $canvas(systemMaxWidth) \
						$canvas(bigTextFontHeight)]

	set canvas(colorBarCanvas) $frame_name.c

	lappend nodestatus   "$canvas(nodeColorFREE) FREE"    \
			 "$canvas(nodeColorDOWN)   DOWN"  \
			 "$canvas(nodeColorOFFL)   OFFL"  \
			 "$canvas(nodeColorRSVD)   RSVD"  \
			 "$canvas(nodeColorNOINFO) NOINFO" \
			 "$canvas(nodeColorINUSEshared) INUSE/SHARED"

	colorBarPopulate [expr 2*$canvas(smallLabelFontWidth)] $canvas(bigBd) \
			 $nodestatus fixed

        scrollbar $frame_name.xscroll -orient horizontal \
                -relief flat \
                -borderwidth $canvas(bigBd) \
                -background $canvas(bigScrollBg) \
                -width $canvas(smallLabelFontHeight) \
                -command [list $frame_name.c xview]
	set canvas(colorBarScroll) $frame_name.xscroll

	pack $frame_name.c -side left -anchor nw -fill x -expand true \
							-padx 1m -pady 1m

	set pos [$canvas(colorBarCanvas) bbox all]
	set x1 [lindex $pos 0]
	set y1 [lindex $pos 1]
	set x2 [lindex $pos 2]
	set y2 [lindex $pos 3]
	set width  [expr ($x2 - $x1) + 2*$canvas(smallLabelFontWidth)]
	set height [expr ($y2 - $y1) + 2*$canvas(smallLabelFontHeight)]

	$canvas(colorBarCanvas) configure -scrollregion "0 0 $width $height"
	if {$width > $canvas(systemMaxWidth)} {
	   catch {pack $canvas(colorBarScroll) -side right -anchor se \
		-expand true -pady [expr $canvas(smallLabelFontHeight)/2]}
	}
}

proc colorBarUpdate {} {

	global sysinfo canvas

	foreach s [array names sysinfo] {
		set s_list [split $s ","]
		set head [lindex $s_list 0]
		if {[string compare $head "color"] == 0} {
			set job [lindex $s_list 1]

			if {[string compare $job TIMESHARED] != 0} {
				lappend color($sysinfo($s)) \
					$job.$sysinfo(colorCnt,$job)nodes

			}
		}
	}

	set inuse ""
	if {[string compare $canvas(nodeColorINUSEshared) \
			    	     $canvas(nodeColorINUSEexclusive)] != 0 } {
		foreach c [array names color] {
			set jobs [join $color($c) ","]
			lappend inuse "$c {INUSE($jobs)}"
  
		}

	}

	set pos [$canvas(colorBarCanvas) bbox fixed]	
	set x [lindex $pos 0]
	set y [lindex $pos 3]
	catch {$canvas(colorBarCanvas) delete variable}
	colorBarPopulate $x [expr $y + $canvas(bigBd)] $inuse variable

	set pos [$canvas(colorBarCanvas) bbox all]
	set x1 [lindex $pos 0]
	set y1 [lindex $pos 1]
	set x2 [lindex $pos 2]
	set y2 [lindex $pos 3]
	set width  [expr ($x2 - $x1) + 2*$canvas(smallLabelFontWidth)]
	set height [expr ($y2 - $y1) + 2*$canvas(smallLabelFontHeight)]

	$canvas(colorBarCanvas) configure -scrollregion "0 0 $width $height"
	if {$width > $canvas(systemMaxWidth)} {
	   catch {pack $canvas(colorBarScroll) -side right -anchor se \
		-expand true -pady [expr $canvas(smallLabelFontHeight)/2]}
	} else {
	   catch {pack forget $canvas(colorBarScroll)}
	}
}
