#         OpenPBS (Portable Batch System) v2.3 Software License
# 
# Copyright (c) 1999-2000 Veridian Information Solutions, Inc.
# All rights reserved.
# 
# ---------------------------------------------------------------------------
# For a license to use or redistribute the OpenPBS software under conditions
# other than those described below, or to purchase support for this software,
# please contact Veridian Systems, PBS Products Department ("Licensor") at:
# 
#    www.OpenPBS.org  +1 650 967-4675                  sales@OpenPBS.org
#                        877 902-4PBS (US toll-free)
# ---------------------------------------------------------------------------
# 
# This license covers use of the OpenPBS v2.3 software (the "Software") at
# your site or location, and, for certain users, redistribution of the
# Software to other sites and locations.  Use and redistribution of
# OpenPBS v2.3 in source and binary forms, with or without modification,
# are permitted provided that all of the following conditions are met.
# After December 31, 2001, only conditions 3-6 must be met:
# 
# 1. Commercial and/or non-commercial use of the Software is permitted
#    provided a current software registration is on file at www.OpenPBS.org.
#    If use of this software contributes to a publication, product, or
#    service, proper attribution must be given; see www.OpenPBS.org/credit.html
# 
# 2. Redistribution in any form is only permitted for non-commercial,
#    non-profit purposes.  There can be no charge for the Software or any
#    software incorporating the Software.  Further, there can be no
#    expectation of revenue generated as a consequence of redistributing
#    the Software.
# 
# 3. Any Redistribution of source code must retain the above copyright notice
#    and the acknowledgment contained in paragraph 6, this list of conditions
#    and the disclaimer contained in paragraph 7.
# 
# 4. Any Redistribution in binary form must reproduce the above copyright
#    notice and the acknowledgment contained in paragraph 6, this list of
#    conditions and the disclaimer contained in paragraph 7 in the
#    documentation and/or other materials provided with the distribution.
# 
# 5. Redistributions in any form must be accompanied by information on how to
#    obtain complete source code for the OpenPBS software and any
#    modifications and/or additions to the OpenPBS software.  The source code
#    must either be included in the distribution or be available for no more
#    than the cost of distribution plus a nominal fee, and all modifications
#    and additions to the Software must be freely redistributable by any party
#    (including Licensor) without restriction.
# 
# 6. All advertising materials mentioning features or use of the Software must
#    display the following acknowledgment:
# 
#     "This product includes software developed by NASA Ames Research Center,
#     Lawrence Livermore National Laboratory, and Veridian Information
#     Solutions, Inc.
#     Visit www.OpenPBS.org for OpenPBS software support,
#     products, and information."
# 
# 7. DISCLAIMER OF WARRANTY
# 
# THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. 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 SHALL VERIDIAN CORPORATION, ITS AFFILIATED COMPANIES, OR THE
# U.S. GOVERNMENT OR ANY OF ITS AGENCIES BE LIABLE FOR ANY DIRECT OR 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)}
	}
}
