# Scrolledhtml
# ----------------------------------------------------------------------
# Implements a scrolled html text widget by inheritance from scrolledtext
# Import reads from an html file, while export still writes plain text
# Also provides a render command, to display html text passed in as an
# argument.
#
# This widget is HTML3.2 compliant, with the following exceptions:
#   a) nothing requiring a connection to an HTTP server is supported
#   b) some of the image alignments aren't supported, because they're not
#      supported by the text widget
#   c) the br attributes that go with the image alignments aren't implemented
#   d) background images are not supported, because they're not supported
#      by the text widget
#   e) automatic table/table cell sizing doesn't work very well.
#
# WISH LIST:
#   This section lists possible future enhancements.
#
#   1) size tables better using dlineinfo.
#   2) make images scroll smoothly off top like they do off bottom. (limitation
#      of text widget?)
#   3) add ability to get non-local URLs
#       a) support forms
#       b) support imagemaps
#   4) keep track of visited links
#   5) add tclets support
#
# BUGS:
#   Cells in a table can be caused to overlap. ex:
#      <table border width="100%">
#      <tr><td>cell1</td><td align=right rowspan=2>cell2</td></tr>
#      <tr><td colspan=2>cell3 w/ overlap</td>
#      </table>
#   It hasn't been fixed because 1) it's a pain to fix, 2) the fix would slow
#   tables down by a significant amount, and 3) netscape has the same
#   bug, as of V3.01, and no one seems to care.
#
#   In order to size tables properly, they must be visible, which causes an
#   annoying jump from table to table through the document at render time.
#
# ----------------------------------------------------------------------
#  AUTHOR: Kris Raney                    EMAIL: kraney@spd.dsccc.com
#
#  @(#) $Id: scrolledhtml.itk,v 1.7 2002/02/16 05:11:08 mgbacke Exp $
# ----------------------------------------------------------------------
#            Copyright (c) 1996 DSC Technologies Corporation
# ======================================================================
# Permission to use, copy, modify, distribute and license this software
# and its documentation for any purpose, and without fee or written
# agreement with DSC, is hereby granted, provided that the above copyright
# notice appears in all copies and that both the copyright notice and
# warranty disclaimer below appear in supporting documentation, and that
# the names of DSC Technologies Corporation or DSC Communications
# Corporation not be used in advertising or publicity pertaining to the
# software without specific, written prior permission.
#
# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
# SOFTWARE.
# ======================================================================

# Acknowledgements:
#
# Special thanks go to Sam Shen(SLShen@lbl.gov), as this code is based on his
# tkhtml.tcl code from tk inspect. The original code is copyright 1995
# Lawrence Berkeley Laboratory.
#
# This software is copyright (C) 1995 by the Lawrence Berkeley Laboratory.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that: (1) source code distributions
# retain the above copyright notice and this paragraph in its entirety, (2)
# distributions including binary code include the above copyright notice and
# this paragraph in its entirety in the documentation or other materials
# provided with the distribution, and (3) all advertising materials mentioning
# features or use of this software display the following acknowledgement:
# ``This product includes software developed by the University of California,
# Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
# the University nor the names of its contributors may be used to endorse
# or promote products derived from this software without specific prior
# written permission.
#
# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
# This code is based on Angel Li's (angel@flipper.rsmas.miami.edu) HTML

 
#
# Default resources.
#
option add *Scrolledhtml.borderWidth 2 widgetDefault
option add *Scrolledhtml.relief sunken widgetDefault
option add *Scrolledhtml.scrollMargin 3 widgetDefault
option add *Scrolledhtml.width 500 widgetDefault
option add *Scrolledhtml.height 600 widgetDefault
option add *Scrolledhtml.visibleItems 80x24 widgetDefault
option add *Scrolledhtml.vscrollMode static widgetDefault
option add *Scrolledhtml.hscrollMode static widgetDefault
option add *Scrolledhtml.labelPos n widgetDefault
option add *Scrolledhtml.wrap word widgetDefault

#
# Usual options.
#
itk::usual Scrolledhtml {
    keep -fontname -fontsize -fixedfont -link -alink -linkhighlight \
         -activebackground -activerelief -background -borderwidth -cursor \
         -elementborderwidth -foreground -highlightcolor -highlightthickness \
         -insertbackground -insertborderwidth -insertofftime -insertontime \
         -insertwidth -jump -labelfont -selectbackground -selectborderwidth \
         -selectforeground -textbackground -textfont -troughcolor -unknownimage
}

# ------------------------------------------------------------------
#                           SCROLLEDHTML
# ------------------------------------------------------------------
itcl::class iwidgets::Scrolledhtml {
  inherit iwidgets::Scrolledtext

  constructor {args} {}
  destructor {}

  itk_option define -feedback feedBack FeedBack {}
  itk_option define -linkcommand linkCommand LinkCommand {}
  itk_option define -fontname fontname FontName times
  itk_option define -fixedfont fixedFont FixedFont courier
  itk_option define -fontsize fontSize FontSize medium
  itk_option define -link link Link blue
  itk_option define -alink alink ALink red
  itk_option define -linkhighlight alink ALink red
  itk_option define -unknownimage unknownimage File {}
  itk_option define -textbackground textBackground Background {}
  itk_option define -update update Update 1
  itk_option define -debug debug Debug 0

  public method import {args}
  public method clear {}
  public method render {html {wd .}}
  public method title {} {return $_title}
  public method pwd {} {return $_cwd}

  protected method _setup {}
  protected method _set_tag {}
  protected method _reconfig_tags {}
  protected method _append_text {text}
  protected method _do {text}
  protected method _definefont {name foundry family weight slant registry}
  protected method _peek {instack}
  protected method _push {instack value}
  protected method _pop {instack}
  protected method _parse_fields {array_var string}
  protected method _href_click {cmd href}
  protected method _set_align {align}
  protected method _fixtablewidth {hottext table multiplier}

  protected method _header {level args}
  protected method _/header {level}

  protected method _entity_a {args}
  protected method _entity_/a {}
  protected method _entity_address {}
  protected method _entity_/address {}
  protected method _entity_b {}
  protected method _entity_/b {} 
  protected method _entity_base {{args {}}}
  protected method _entity_basefont {{args {}}}
  protected method _entity_big {}
  protected method _entity_/big {} 
  protected method _entity_blockquote {}
  protected method _entity_/blockquote {} 
  protected method _entity_body {{args {}}}
  protected method _entity_/body {}
  protected method _entity_br {{args {}}}
  protected method _entity_center {}
  protected method _entity_/center {}
  protected method _entity_cite {}
  protected method _entity_/cite {}
  protected method _entity_code {}
  protected method _entity_/code {}
  protected method _entity_dir {{args {}}}
  protected method _entity_/dir {}
  protected method _entity_div {{args {}}}
  protected method _entity_dl {{args {}}}
  protected method _entity_/dl {}
  protected method _entity_dt {}
  protected method _entity_dd {}
  protected method _entity_dfn {}
  protected method _entity_/dfn {}
  protected method _entity_em {}
  protected method _entity_/em {}
  protected method _entity_font {{args {}}}
  protected method _entity_/font {}
  protected method _entity_h1 {{args {}}}
  protected method _entity_/h1 {}
  protected method _entity_h2 {{args {}}}
  protected method _entity_/h2 {}
  protected method _entity_h3 {{args {}}}
  protected method _entity_/h3 {}
  protected method _entity_h4 {{args {}}}
  protected method _entity_/h4 {}
  protected method _entity_h5 {{args {}}}
  protected method _entity_/h5 {}
  protected method _entity_h6 {{args {}}}
  protected method _entity_/h6 {}
  protected method _entity_hr {{args {}}}
  protected method _entity_i {}
  protected method _entity_/i {}
  protected method _entity_img {{args {}}}
  protected method _entity_kbd {}
  protected method _entity_/kbd {}
  protected method _entity_li {{args {}}}
  protected method _entity_listing {}
  protected method _entity_/listing {}
  protected method _entity_menu {{args {}}}
  protected method _entity_/menu {}
  protected method _entity_ol {{args {}}}
  protected method _entity_/ol {}
  protected method _entity_p {{args {}}}
  protected method _entity_pre {{args {}}}
  protected method _entity_/pre {}
  protected method _entity_samp {}
  protected method _entity_/samp {}
  protected method _entity_small {}
  protected method _entity_/small {} 
  protected method _entity_sub {}
  protected method _entity_/sub {} 
  protected method _entity_sup {}
  protected method _entity_/sup {} 
  protected method _entity_strong {}
  protected method _entity_/strong {}
  protected method _entity_table {{args {}}}
  protected method _entity_/table {}
  protected method _entity_td {{args {}}}
  protected method _entity_/td {}
  protected method _entity_th {{args {}}}
  protected method _entity_/th {}
  protected method _entity_title {}
  protected method _entity_/title {}
  protected method _entity_tr {{args {}}}
  protected method _entity_/tr {}
  protected method _entity_tt {}
  protected method _entity_/tt {}
  protected method _entity_u {}
  protected method _entity_/u {}
  protected method _entity_ul {{args {}}}
  protected method _entity_/ul {}
  protected method _entity_var {}
  protected method _entity_/var {}

  protected variable _title {}             ;# The title of the html document
  protected variable _licount 1            ;# list element count
  protected variable _listyle bullet       ;# list element style
  protected variable _lipic {}             ;# picture to use as bullet
  protected variable _color black          ;# current text color
  protected variable _bgcolor #d9d9d9      ;# current background color
  protected variable _link blue            ;# current link color
  protected variable _alink red            ;# current highlight link color
  protected variable _smallpoints "60 80 100 120 140 180 240"   ;# font point
  protected variable _mediumpoints "80 100 120 140 180 240 360" ;# sizes for
  protected variable _largepoints "100 120 140 180 240 360 480" ;# various
  protected variable _hugepoints "120 140 180 240 360 480 640"  ;# fontsizes
  protected variable _font times           ;# name of current font
  protected variable _rulerheight 6        ;#
  protected variable _indentincr 4         ;# increment to indent by
  protected variable _counter -1           ;# counter to give unique numbers
  protected variable _left 0               ;# initial left margin
  protected variable _left2 0              ;# subsequent left margin
  protected variable _right 0              ;# right margin
  protected variable _justify L            ;# text justification
  protected variable _offset 0             ;# text offset (super/subscript)
  protected variable _textweight 0         ;# boldness of text
  protected variable _textslant 0          ;# whether to use italics
  protected variable _underline 0          ;# whether to use underline
  protected variable _verbatim 0           ;# whether to skip formatting
  protected variable _pre 0                ;# preformatted text
  protected variable _intitle 0            ;# in <title>...</title>
  protected variable _anchorcount 0        ;# number of anchors
  protected variable _stack                ;# array of stacks
  protected variable _pointsndx 2          ;# 
  protected variable _fontnames            ;# list of accepted font names
  protected variable _fontinfo             ;# array of font info given font name
  protected variable _tag                  ;# 
  protected variable _tagl                 ;#
  protected variable _tagfont              ;#
  protected variable _cwd .                ;# base directory of current page
  protected variable _anchor               ;# array of indexes by anchorname
  protected variable _defaulttextbackground;# default text background
  protected variable _intable 0            ;# whether we are in a table now
  protected variable _hottext              ;# widget where text currently goes
  protected variable _basefontsize 2       ;# as named
  protected variable _unknownimg {}        ;# name of unknown image
  protected variable _images {}            ;# list of images we created
  protected variable _prevpos {}           ;# temporary used for table updates
  protected variable _prevtext {}          ;# temporary used for table updates

  private variable _initialized 0

  private variable _defUnknownImg [::image create photo -data {
R0lGODdhHwAgAPQAAP///wAAAMzMzC9PT76+vvnTogCR/1WRVaoAVf//qvT09OKdcWlcx19f
X9/f339/f8vN/J2d/aq2qoKCggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ACwAAAAAHwAgAAAF/iAgjqRDnmiKmqOkqsTaToDjvudTttLjOITJbTQhGI+iQE0xMvZqQIDw
NAEiAcqRVdKAGh0NyVCkuyqZBEmwofgRrFIxSaI0JmuA9KTrthIicWMTAQ8xWHgSe15AVgcJ
eVMjDwECOkome22Mb0cHCzEPOiQPgwGXCjomakedA0VgY1IPDZcuP3l5YkcRDwMHqDQoEzq2
Pz8IQkK7Bw8HDg+xO26PCAgRDcpGswEK2Dh9ItUMDdirPYUKwTKMjwDV1gHlR2oCkSmcI9UE
BabYrGnQoolgBCGckX7yWJWDYaUMAYSRFECAwMXeiU1BHpKTB4CBR4+oBOb5By1UNgUfXj0C
8HaP079sBCCkZIAKWst/OGPOhNBNHQmXOeftJBASRVCcEiIojQDBwIOeRo+SpGXKFFGbP6Xi
nLWxEMsmWpEOC9XDYtigYtKSwsH2xdq2cEfRmFS1rt27eE09CAEAOw==
}]
}

#
# Provide a lowercased access method for the Scrolledhtml class.
#
proc ::iwidgets::scrolledhtml {pathName args} {
    uplevel ::iwidgets::Scrolledhtml $pathName $args
}

# ------------------------------------------------------------------
#                        CONSTRUCTOR
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::constructor {args} {
  # define the fonts we're going to use
  set _fontnames ""
  _definefont helvetica adobe helvetica "medium bold" "r o" iso8859
  _definefont courier adobe courier "medium bold" "r o" iso8859
  _definefont times adobe times "medium bold" "r i" iso8859
  _definefont symbol adobe symbol "medium medium" "r r" adobe

  $itk_component(text) configure -state disabled

  eval itk_initialize $args
  if {[lsearch -exact $args -linkcommand] == -1} {
    configure -linkcommand [itcl::code $this import -link]
  }
  set _initialized 1
}

# ------------------------------------------------------------------
#                        DESTRUCTOR
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::destructor {} {
    foreach x $_images {
      ::image delete $x
    }
    if {$_unknownimg != $_defUnknownImg} {
      ::image delete $_unknownimg
    }
}

# ------------------------------------------------------------------
#                             OPTIONS
# ------------------------------------------------------------------
 
# ------------------------------------------------------------------
# OPTION: -fontsize
#
# Set the general size of the font.
# ------------------------------------------------------------------
itcl::configbody iwidgets::Scrolledhtml::fontsize {
    switch $itk_option(-fontsize) {
        small { }
        medium { }
        large { }
        huge { }
        default {
            error "bad fontsize option\
                   \"$itk_option(-fontsize)\": should\
                   be small, medium, large, or huge"
        }
    }
    _reconfig_tags
}

# ------------------------------------------------------------------
# OPTION: -fixedfont
#
# Set the fixed font name
# ------------------------------------------------------------------
itcl::configbody iwidgets::Scrolledhtml::fixedfont {
   if {[lsearch -exact $_fontnames $itk_option(-fixedfont)] == -1} {
     error "Invalid font name \"$itk_option(-fixedfont)\". Must be one of \
         $_fontnames"
  }
}

# ------------------------------------------------------------------
# OPTION: -fontname
#
# Set the default font name
# ------------------------------------------------------------------
itcl::configbody iwidgets::Scrolledhtml::fontname {
   if {[lsearch -exact $_fontnames $itk_option(-fontname)] == -1} {
     error "Invalid font name \"$itk_option(-fontname)\". Must be one of \
         $_fontnames"
  }
}

# ------------------------------------------------------------------
# OPTION: -textbackground
#
# Set the default text background
# ------------------------------------------------------------------
itcl::configbody iwidgets::Scrolledhtml::textbackground {
  set _defaulttextbackground $itk_option(-textbackground)
}

# ------------------------------------------------------------------
# OPTION: -linkhighlight
#
# same as alink
# ------------------------------------------------------------------
itcl::configbody iwidgets::Scrolledhtml::linkhighlight {
  configure -alink $itk_option(-linkhighlight)
}

# ------------------------------------------------------------------
# OPTION: -unknownimage
#
# set image to use as substitute for images that aren't found
# ------------------------------------------------------------------
itcl::configbody iwidgets::Scrolledhtml::unknownimage {
   set oldimage $_unknownimg
   if {$itk_option(-unknownimage) != {}} {
      set uki $itk_option(-unknownimage)
      if [catch { set _unknownimg [::image create photo -file $uki] } err] {
         error "Couldn't create image $uki:\n$err\nUnknown image not found"
      }
   } else {
      set _unknownimg $_defUnknownImg
   }
   if {$oldimage != {} && $oldimage != $_defUnknownImg} {
      ::image delete $oldimage
   }
}

# ------------------------------------------------------------------
# OPTION: -update
#
# boolean indicating whether to update during rendering
# ------------------------------------------------------------------
itcl::configbody iwidgets::Scrolledhtml::update {
   switch -- $itk_option(-update) {
     0 {}
     1 {}
     true {
       configure -update 1
     }
     yes {
       configure -update 1
     }
     false {
       configure -update 0
     }
     yes {
       configure -update 0
     }
     default {
       error "invalid -update; must be boolean"
     }
   }
}

# ------------------------------------------------------------------
#                            METHODS
# ------------------------------------------------------------------
 
# ------------------------------------------------------------------
# METHOD: clear
#
# Clears the text out
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::clear {} {
    $itk_component(text) config -state normal
    $itk_component(text) delete 1.0 end
    foreach x $_images {
      ::image delete $x
    }
    set _images {}
    _setup
    $itk_component(text) config -state disabled
}

# ------------------------------------------------------------------
# METHOD import ?-link? filename?#anchorname?
#
# read html text from a file (import filename) if the keyword link is present, 
# pathname is relative to last page, otherwise it is relative to current 
# directory. This allows the user to use a linkcommand of 
# "<widgetname> import -link"
#
# if '#anchorname' is appended to the filename, the page is displayed starting
# at the anchor named 'anchorname' If an anchor is specified without a filename,
# the current page is assumed.
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::import {args} {

  update idletasks

  set len [llength $args]
  if {$len != 1 && $len != 2} {
      error "wrong # args: should be \
              \"$itk_component(hull) import ?-link? filename\""
  }
  set linkname [lindex $args [expr {$len - 1}]]

  #
  # Seperate filename#anchorname
  #
  if ![regexp {(.*)#(.*)} $linkname dummy filename anchorname] {
    set filename $linkname
  }
  if {$filename!=""} {
    #
    # Check for -link option
    #
    switch -- $len {
      1 {
        #
        # open file & set cwd to that file's directory
        #
        set f [open $filename r]
        set _cwd [file dirname $filename]
      }
      2 {
        switch -- [lindex $args 0] {
          -link {
              #
              # got -link, so set path relative to current locale, if path
              # is a relative pathname
              #
              if {[string compare "." [file dirname $filename]] == 0} {
                set f [open $_cwd/$filename r]
              } else {
                if {[string index [file dirname $filename] 0] != "/" &&\
                    [string index [file dirname $filename] 0] != "~"} {
                  set f [open $_cwd/$filename r]
                  append _cwd /
                  append _cwd [file dirname $filename]
                } else {
                  set f [open $filename r]
                  set _cwd [file dirname $filename]
                }
              }
          }
          default {
            # got something other than -link
            error "invalid format: should be \
                  \"$itk_component(hull) import ?-link? filename\""
          }
        }
      }
    }
    set txt [read $f]
    close $f
    render $txt $_cwd
  }

  #
  # if an anchor was requested, move that anchor into view
  #
  if [ info exists anchorname] {
    if {$anchorname!=""} {
      if [info exists _anchor($anchorname)] {
        $itk_component(text) see end
        $itk_component(text) see $_anchor($anchorname)
      }
    } else {
      $itk_component(text) see 0.0
    }
  }
}

# ------------------------------------------------------------------
# METHOD: render text ?wd?
#
# Clear the text, then render html formatted text. Optional wd argument 
# sets the base directory for any links or images. 
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::render {html {wd .}} {

    update idletasks

    #
    # blank text and reset all state variables
    #
    clear
    set _cwd $wd

    #
    # make text writable
    #
    $itk_component(text) config -state normal
    set continuerendering 1
    _set_tag
    while {$continuerendering} {
	# normal state
	while {[set len [string length $html]]} {
	    # look for text up to the next <> element
	    if [regexp -indices "^\[^<\]+" $html match] {
		set text [string range $html 0 [lindex $match 1]]
		_append_text "$text"
		set html \
		    [string range $html [expr {[lindex $match 1]+1}] end]
	    }
	    # we're either at a <>, or at the eot
	    if [regexp -indices "^<((\[^>\"\]+|(\"\[^\"\]*\"))*)>" $html match entity] {
		regsub -all "\n" [string range $html [lindex $entity 0] \
			    [lindex $entity 1]] "" entity
		set cmd [string tolower [lindex $entity 0]]
		if {[info command _entity_$cmd]!=""} {
		  if {[catch {eval _entity_$cmd [lrange $entity 1 end]} bad]} {
		    if {$itk_option(-debug)} {
		      global errorInfo
		      puts stderr "render: _entity_$cmd [lrange $entity 1 end] = Error:$bad\n$errorInfo"
		    }
		  }
		}
		set html \
		    [string range $html [expr {[lindex $match 1]+1}] end]
	    }
	    if {$itk_option(-feedback) != {} } {
	      eval $itk_option(-feedback) $len
	    }
	    if $_verbatim break
	}
	# we reach here if html is empty, or _verbatim is 1
	if !$len break
	# _verbatim must be 1
	# append text until next tag is reached
	if [regexp -indices "<.*>" $html match] {
	    set text [string range $html 0 [expr {[lindex $match 0]-1}]]
	    set html [string range $html [expr {[lindex $match 0]}] end]
	} else {
	    set text $html
	    set html ""
	}
	_append_text "$text"
    }
    $itk_component(text) config -state disabled
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _setup
#
# Reset all state variables to prepare for a new page.
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_setup {} {
    set _font $itk_option(-fontname)
    set _left 0
    set _left2 0
    set _right 0
    set _justify L
    set _textweight 0
    set _textslant 0
    set _underline 0
    set _verbatim 0
    set _pre 0
    set _title {}
    set _intitle 0
    set _anchorcount 0
    set _intable 0
    set _hottext $itk_component(text)
    set _stack(font) {}
    set _stack(color) {}
    set _stack(bgcolor) {}
    set _stack(link) {}
    set _stack(alink) {}
    set _stack(justify) {}
    set _stack(listyle) {}
    set _stack(lipic) {}
    set _stack(href) {}
    set _stack(pointsndx) {}
    set _stack(left) {}
    set _stack(left2) {}
    set _stack(offset) {}
    set _stack(table) {}
    set _stack(tablewidth) {}
    set _stack(row) {}
    set _stack(column) {}
    set _stack(hottext) {}
    set _stack(tableborder) {}
    set _stack(cellpadding) {}
    set _stack(cellspacing) {}
    set _stack(licount) {}
    set _basefontsize 2
    set _pointsndx 2
    set _counter -1
    set _bgcolor $_defaulttextbackground
    set _color $itk_option(-foreground)
    set _link $itk_option(-link)
    set _alink $itk_option(-alink)
    config -textbackground $_bgcolor
    foreach x [array names _anchor] { unset _anchor($x) }
    $itk_component(text) tag config hr -relief sunken -borderwidth 2 \
            -font -*-*-*-*-*-*-$_rulerheight-*-*-*-*-*-*-*
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _definefont name foundry family weight slant registry
#
# define font information used to generate font value from font name
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_definefont \
            {name foundry family weight slant registry} {
    if {[lsearch -exact $_fontnames $name] == -1 } {
      lappend _fontnames $name
    }
    set _fontinfo($name) \
	[list $foundry $family $weight $slant $registry]
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _append_text text
#
# append text in the format described by the state variables
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_append_text {text} {
    if {!$_intable && $itk_option(-update)} {update}
    if {[string first "&" $text] != -1} {
       regsub -nocase -all "&amp;" $text {\&} text
       regsub -nocase -all "&lt;" $text "<" text
       regsub -nocase -all "&gt;" $text ">" text
       regsub -nocase -all "&quot;" $text "\"" text
    }
    if !$_verbatim {
	if !$_pre {
            set text [string trim $text "\n\r"]
	    regsub -all "\[ \n\r\t\]+" $text " " text
	}
	if ![string length $text] return
    }
    if {!$_pre && !$_intitle} {
     	if {[catch {$_hottext get "end - 2c"} p]} {
     	    set p ""
     	}
	set n [string index $text 0]
        if {$n == " " && $p == " "} {
          set text [string range $text 1 end]
        }
 	if {[catch {$_hottext insert end $text $_tag}]} {
 	    set pht [winfo parent $_hottext]
 	    catch {$pht insert end $text $_tag}
 	}
	return
    }
    if {$_pre && !$_intitle} {
 	if {[catch {$_hottext insert end $text $_tag}]} {
 	    set pht [winfo parent $_hottext]
 	    catch {$pht insert end $text $_tag}
 	}
	return
    }
    append _title $text
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _set_tag
#
# generate a tag
# ------------------------------------------------------------------
# a tag is constructed as: font?B?I?U?Points-LeftLeft2RightColorJustify
itcl::body iwidgets::Scrolledhtml::_set_tag {} {
    set i -1
    foreach var {foundry family weight slant registry} {
	set $var [lindex $_fontinfo($_font) \
               [incr i]]
    }
    set x_font "-$foundry-$family-"
    set _tag $_font
    set args {}
    if {$_textweight > 0} {
	append _tag "B"
	append x_font [lindex $weight 1]-
    } else {
	append x_font [lindex $weight 0]-
    }
    if {$_textslant > 0} {
	append _tag "I"
	append x_font [lindex $slant 1]-
    } else {
	append x_font [lindex $slant 0]-
    }
    if {$_underline > 0} {
	append _tag "U"
	append args " -underline 1"
    }
    switch $_justify {
	L { append args " -justify left" }
	R { append args " -justify right" }
	C { append args " -justify center" }
    }
    append args " -offset $_offset"
        
    set pts [lindex [set [format "_%spoints" $itk_option(-fontsize)]] \
                  $_pointsndx]
    append _tag $_pointsndx - $_left \
	$_left2 $_right \
	$_color $_justify
    append x_font "normal-*-*-$pts-*-*-*-*-$registry-*"
    if $_anchorcount {
	set href [_peek href]
	set href_tag href[incr _counter]
	set tags [list $_tag $href_tag]
	if { $itk_option(-linkcommand)!= {} } {
	    $_hottext tag bind $href_tag <1> \
		[list uplevel #0 $itk_option(-linkcommand) $href]
	}
	$_hottext tag bind $href_tag <Enter> \
	    [list $_hottext tag configure $href_tag \
                  -foreground $_alink]
	$_hottext tag bind $href_tag <Leave> \
	    [list $_hottext tag configure $href_tag \
	     -foreground $_color]
    } else {
	set tags $_tag
    }
    if {![info exists _tagl($_tag)]} {
	set _tagfont($_tag) 1
	eval $_hottext tag configure $_tag \
	    -foreground ${_color} \
	    -lmargin1 ${_left}m \
	    -lmargin2 ${_left2}m $args
	if [catch {eval $_hottext tag configure $_tag \
	    -font $x_font} err] {
          _definefont $_font * $family $weight $slant *
          regsub \$foundry $x_font * x_font
          regsub \$registry $x_font * x_font
	  catch {eval $_hottext tag configure $_tag -font $x_font}
        }
    }
    if [info exists href_tag] {
	$_hottext tag raise $href_tag $_tag
    }
    set _tag $tags
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _reconfig_tags
#
# reconfigure tags following a configuration change
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_reconfig_tags {} {
  if $_initialized {
    foreach tag [$itk_component(text) tag names] {
	foreach efont $_fontnames {
	    if [regexp "${efont}(B?)(I?)(U?)(\[1-9\]\[0-9\]*)-" $tag t b i u points] {
		set j -1
		set _font $efont
		foreach var {foundry family weight slant registry} {
		    set $var [lindex $_fontinfo($_font) [incr j]]
		}
		set x_font "-$foundry-$family-"
		if {$b == "B"} {
		    append x_font [lindex $weight 1]-
		} else {
		    append x_font [lindex $weight 0]-
		}
		if {$i == "I"} {
		    append x_font [lindex $slant 1]-
		} else {
		    append x_font [lindex $slant 0]-
		}
		set pts [lindex [set [format \
                     "_%spoints" $itk_option(-fontsize)]] $points]
		append x_font "normal-*-*-$pts-*-*-*-*-$registry-*"
		$itk_component(text) tag config $tag -font $x_font
		break
	    }
	}
    }
  }
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _push instack value
#
# push value onto stack(instack)
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_push {instack value} {
    set _stack($instack) [linsert $_stack($instack) 0 $value]
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _pop instack
#
# pop value from stack(instack)
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_pop {instack} {
    if {$_stack($instack) == ""} {
	error "popping empty _stack $instack"
    }
    set val [lindex $_stack($instack) 0]
    set _stack($instack) [lrange $_stack($instack) 1 end]
    return $val
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _peek instack
#
# peek at top value on stack(instack)
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_peek {instack} {
    return [lindex $_stack($instack) 0]
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _parse_fields array_var string
#
# parse fields from a href or image tag. At the moment, doesn't support
# spaces in field values. (e.g. alt="not avaliable")
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_parse_fields {array_var string} {
  upvar $array_var array
  if {$string != "{}" } {
    regsub -all "( *)=( *)" $string = string
    regsub -all {\\\"} $string \" string
    while {$string != ""} {
      if ![regexp "^ *(\[^ \n\r=\]+)=\"(\[^\"\n\r\t\]*)(.*)" $string \
                      dummy field value newstring] {
        if ![regexp "^ *(\[^ \n\r=\]+)=(\[^\n\r\t \]*)(.*)" $string \
                      dummy field value newstring] {
          if ![regexp "^ *(\[^ \n\r\]+)(.*)" $string dummy field newstring] {
            error "malformed command field; field = \"$string\""
            continue
          }
          set value ""
        }
      }
      set array([string tolower $field]) $value
      set string "$newstring"
    }
  }
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _href_click
#
# process a click on an href
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_href_click {cmd href} {
  uplevel #0 $cmd $href
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _set_align
#
# set text alignment
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_set_align {align} {
      switch [string tolower $align] {
        center {
          set _justify C
        }
        left {
          set _justify L
        }
        right {
          set _justify R
        }
        default {}
      }
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _fixtablewidth
#
# fix table width & height
# essentially, with nested tables the outer table must be configured before
# the inner table, but the idle tasks get queued up in the opposite order, 
# so process later idle tasks before sizing yourself.
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_fixtablewidth {hottext table multiplier} {
  update idletasks
  $hottext see $_anchor($table)
  update idletasks
  $table configure  \
           -width [expr {$multiplier * [winfo width $hottext] - \
                       	2* [$hottext cget -padx] - \
			2* [$hottext cget -borderwidth]} ] \
           -height [winfo height $table]
  grid propagate $table 0
}
		 

# ------------------------------------------------------------------
# PRIVATE METHOD: _header level
#
# generic entity to set state for <hn> tag
# Accepts argument of the form ?align=[left,right,center]? ?src=<image pname>?
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_header {level args} {
    eval _parse_fields ar $args
    _push justify $_justify
    if [info exists ar(align)] {
      _entity_p align=$ar(align)
    } else {
      _entity_p 
    }
    if [info exists ar(src)] {
        _entity_img src=$ar(src)
    }
    _push pointsndx $_pointsndx
    set _pointsndx [expr {7-$level}]
    incr _textweight
    _set_tag
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _/header level
#
# generic entity to set state for </hn> tag
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_/header {level} {
    set _justify [_pop justify]
    set _pointsndx [_pop pointsndx]
    incr _textweight -1
    _set_tag
    _entity_p
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_a
#
# add an anchor. Accepts arguments of the form ?href=filename#anchorpoint?
# ?name=anchorname?
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_a {args} {
    _parse_fields ar $args
    _push color $_color
    if [info exists ar(href)] {
      _push href $ar(href)
      incr _anchorcount
      set _color $_link
      _entity_u
    } else {
      _push href {}
    }
    if [info exists ar(name)] {
      set _anchor($ar(name)) [$itk_component(text) index end]
    }
    if [info exists ar(id)] {
      set _anchor($ar(id)) [$itk_component(text) index end]
    }
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/a
#
# End anchor
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/a {} {
  set href [_pop href]
  if {$href != {}} {
    incr _anchorcount -1
    set _color [_pop color]
    _entity_/u
  }
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_address
#
# display an address
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_address {} {
    _entity_br
    _entity_i
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/address
#
# change state back from address display
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/address {} {
  _entity_/i
  _entity_br
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_b
#
# Change current font to bold
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_b {} { 
    incr _textweight
    _set_tag 
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/b
#
# change current font back from bold
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/b {} {
    incr _textweight -1
    _set_tag
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_base
#
# set the cwd of the document
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_base {{args {}}} { 
    _parse_fields ar $args
    if [info exists ar(href)] {
      set _cwd [file dirname $ar(href)]
    }
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_basefont
#
# set base font size
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_basefont {{args {}}} { 
    _parse_fields ar $args
    if {[info exists ar(size)]} {
      set _basefontsize $ar(size)
    }
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_big
#
# Change current font to a bigger size
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_big {} { 
    _push pointsndx $_pointsndx
    if {[incr _pointsndx 2] > 6} {
       set _pointsndx 6
    }
    _set_tag 
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/big
#
# change current font back from bigger size
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/big {} {
    set _pointsndx [_pop pointsndx]
    _set_tag
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_blockquote
#
# display a block quote
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_blockquote {} { 
    _entity_p
    _push left $_left
    incr _left $_indentincr
    _push left2 $_left2
    set _left2 $_left
    _set_tag 
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/blockquote
#
# change back from blockquote
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/blockquote {} {
    _entity_p
    set _left [_pop left]
    set _left2 [_pop left2]
    _set_tag
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_body
#
# begin body text. Takes argument of the form ?bgcolor=<color>? ?text=<color>?
# ?link=<color>?
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_body {{args {}}} {
    _parse_fields ar $args
    if [info exists ar(bgcolor)] {
       set _bgcolor $ar(bgcolor)
       set temp $itk_option(-textbackground)
       config -textbackground $_bgcolor
       set _defaulttextbackground $temp
    }
    if [info exists ar(text)] {
       set _color $ar(text)
    }
    if [info exists ar(link)] {
       set _link $ar(link)
    }
    if [info exists ar(alink)] {
       set _alink $ar(alink)
    }
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/body
#
# end body text
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/body {} {
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_br
#
# line break
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_br {{args {}}} {
    $_hottext insert end "\n"
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_center
#
# change justification to center
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_center {} {
    _push justify $_justify
    set _justify C
    _set_tag
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/center
#
# change state back from center
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/center {} {
  set _justify [_pop justify]
  _set_tag
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_cite
#
# display citation
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_cite {} {
    _entity_i
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/cite
#
# change state back from citation
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/cite {} {
    _entity_/i
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_code
#
# display code listing
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_code {} {
    _entity_pre
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/code
#
# end code listing
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/code {} {
    _entity_/pre
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_dir
#
# display dir list
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_dir {{args {}}} {
    _entity_ul plain $args
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/dir
#
# end dir list
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/dir {} {
    _entity_/ul
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_div
#
# divide text. same as <p>
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_div {{args {}}} {
    _entity_p $args
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_dl
#
# begin definition list
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_dl {{args {}}} {
    if {$_left == 0} {
      _entity_p
    }
    _push left $_left
    _push left2 $_left2
    if {$_left2 == $_left } {
      incr _left2 [expr {$_indentincr+3}]
    } else {
      incr _left2 $_indentincr
    }
    incr _left $_indentincr
    _push listyle $_listyle
    _push licount $_licount
    set _listyle none
    _set_tag
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/dl
#
# end definition list
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/dl {} {
    set _left [_pop left]
    set _left2 [_pop left2]
    set _listyle [_pop listyle]
    set _licount [_pop licount]
    _set_tag
    if {$_left == 0} {
      _entity_p
    }
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_dt
#
# definition term
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_dt {} {
  set _left [expr {$_left2 - 3}]
  _set_tag
  _entity_p
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_dd
#
# definition definition
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_dd {} {
  set _left $_left2
  _set_tag
   _entity_br
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_dfn
#
# display defining instance of a term
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_dfn {} {
    _entity_i
    _entity_b
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/dfn
#
# change state back from defining instance of term
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/dfn {} {
    _entity_/b
    _entity_/i
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_em
#
# display emphasized text
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_em {} {
    _entity_i
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/em
#
# change state back from emphasized text
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/em {} {
    _entity_/i
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_font
#
# set font size and color
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_font {{args {}}} {
    _parse_fields ar $args
    _push pointsndx $_pointsndx
    _push color $_color
    if [info exists ar(size)] {
      if {![regexp {^[+-].*} $ar(size)]} {
         set _pointsndx $ar(size)
      } else {
        set _pointsndx [expr {$_basefontsize $ar(size)}]
      }
      if { $_pointsndx > 6 } {
       set _pointsndx 6
      } else {
        if { $_pointsndx < 0 } {
          set _pointsndx 0
        }
      }
    }
    if {[info exists ar(color)]} {
      set _color $ar(color)
    }
    _set_tag
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/font
#
# close current font size
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/font {} {
  set _pointsndx [_pop pointsndx]
  set _color [_pop color]
  _set_tag
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_h1
#
# display header level 1. 
# Accepts argument of the form ?align=[left,right,center]? ?src=<image pname>?
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_h1 {{args {}}} {
    _header 1 $args
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/h1
#
# change state back from header 1
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/h1 {} {
    _/header 1
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_h2
#
# display header level 2
# Accepts argument of the form ?align=[left,right,center]? ?src=<image pname>?
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_h2 {{args {}}} {
    _header 2 $args
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/h2
#
# change state back from header 2
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/h2 {} {
    _/header 2 
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_h3
#
# display header level 3
# Accepts argument of the form ?align=[left,right,center]? ?src=<image pname>?
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_h3 {{args {}}} {
    _header 3 $args
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/h3
#
# change state back from header 3
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/h3 {} {
    _/header 3 
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_h4
#
# display header level 4
# Accepts argument of the form ?align=[left,right,center]? ?src=<image pname>?
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_h4 {{args {}}} { 
    _header 4 $args
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/h4
#
# change state back from header 4
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/h4 {} {
    _/header 4
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_h5
#
# display header level 5
# Accepts argument of the form ?align=[left,right,center]? ?src=<image pname>?
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_h5 {{args {}}} {
    _header 5 $args
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/h5
#
# change state back from header 5
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/h5 {} {
    _/header 5
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_h6
#
# display header level 6
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_h6 {{args {}}} {
    _header 6 $args
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/h6
#
# change state back from header 6
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/h6 {} {
    _/header 6
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_hr
#
# Add a horizontal rule
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_hr {{args {}}} {
    _parse_fields ar $args
    if [info exists ar(size)] {
       set font "-font -*-*-*-*-*-*-$ar(size)-*-*-*-*-*-*-*"
    } else {
       set font "-font -*-*-*-*-*-*-2-*-*-*-*-*-*-*"
    }
    if [info exists ar(width)] {
    }
    if [info exists ar(noshade)] {
      set relief "-relief flat"
      set background "-background black"
    } else {
      set relief "-relief sunken"
      set background ""
    }
#    if [info exists ar(align)] {
#       $_hottext tag config hr$_counter -justify $ar(align)
#       set justify -justify $ar(align)
#    } else {
#       set justify ""
#    }
    eval $_hottext tag config hr[incr _counter] $relief $background $font \
            -borderwidth 2
    _entity_p
    $_hottext insert end " \n" hr$_counter
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_i
#
# display italicized text
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_i {} {
    incr _textslant
    _set_tag
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/i
#
# change state back from italicized text
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/i {} {
    incr _textslant -1
    _set_tag
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_img
#
# display an image. takes argument of the form img=<filename>
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_img {{args {}}} {
  _parse_fields ar $args
  set alttext "<image>"

  #
  # If proper argument exists
  #
  if [info exists ar(src)] {
    set imgframe $_hottext.img[incr _counter]
    #
    # if this is an anchor
    #
    if $_anchorcount {
      # create link colored border
      frame $imgframe -borderwidth 2 -background $_link
      bind $imgframe <Enter> \
            [list $imgframe configure -background $_alink]
      bind $imgframe <Leave> \
            [list $imgframe configure -background $_link]
    } else {
      # create plain frame
      frame $imgframe -borderwidth 0 -background $_color
    }

    #
    # try to load image
    #
    if {[string index $ar(src) 0] == "/" || [string index $ar(src) 0] == "~"} {
       set file $ar(src)
    } else {
       set file $_cwd/$ar(src)
    }
    if [catch {set img [::image create photo -file $file]} err] {
      if {[info exists ar(width)] && [info exists ar(height)] } {
        # suggestions exist, so make frame appropriate size and add a border
        $imgframe configure -width $ar(width) -height $ar(height) -borderwidth 2
        pack propagate $imgframe false
      }

      #
      # If alt text is specified, display that
      #
      if [info exists ar(alt)] {
        # add a border
        $imgframe configure -borderwidth 2
        set win $imgframe.text
        label $win -text "$ar(alt)" -background $_bgcolor \
               -foreground $_color
      } else {
        #
        # use 'unknown image'
        set win $imgframe.image#auto
        #
        # make label containing image
        #
        label $win -image $_unknownimg -borderwidth 0 -background $_bgcolor
      }
      pack $win -fill both -expand true
 
    } else {   ;# no error loading image
      lappend _images $img
      set win $imgframe.$img

      #
      # make label containing image
      #
      label $win -image $img -borderwidth 0
    }
    pack $win

    #
    # set alignment
    #
    set align bottom
    if [info exists ar(align)] {
      switch $ar(align) {
        middle {
          set align center
        }
        right {
          set align center
        }
        default {
          set align [string tolower $ar(align)]
        }
      }
    }

    #
    # create window in text to display image
    #
    $_hottext window create end -window \
            $imgframe -align $align

    #
    # set tag for window
    #
    $_hottext tag add $_tag $imgframe
    if $_anchorcount {
        set href [_peek href]
        set href_tag href[incr _counter]
        set tags [list $_tag $href_tag]
        if { $itk_option(-linkcommand)!= {} } {
          bind $win <1> [list uplevel #0 $itk_option(-linkcommand) $href]
        }
    }
  }
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_kbd
#
# Display keyboard input
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_kbd {} {
    incr _textweight
    _entity_tt 
    _set_tag
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/kbd
#
# change state back from displaying keyboard input
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/kbd {} {
    _entity_/tt
    incr _textweight -1
    _set_tag
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_li
#
# begin new list entry
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_li {{args {}}} {
    _parse_fields ar $args
    if [info exists ar(value)] {
       set _licount $ar(value)
    }
    _entity_br
    switch -exact $_listyle {
      bullet {
        set old_font $_font
        set _font symbol
        _set_tag
        $_hottext insert end "\xb7" $_tag
        set _font $old_font
        _set_tag
      }
      none {
      }
      picture {
        _entity_img src="$_lipic" width=4 height=4 align=middle
      }
      A {
          _entity_b
	  $_hottext insert end [format "%c) " [expr {$_licount + 0x40}]] $_tag
          _entity_/b
          incr _licount
      }
      a {
          _entity_b
	  $_hottext insert end [format "%c) " [expr {$_licount + 0x60}]] $_tag
          _entity_/b
          incr _licount
      }
      I {
        _entity_b
        $_hottext insert end "[::iwidgets::roman $_licount]) " $_tag
        _entity_/b
        incr _licount
      }
      i {
        _entity_b
        $_hottext insert end "[::iwidgets::roman $_licount lower])] " $_tag
        _entity_/b
        incr _licount
      }
      default {
        _entity_b
        $_hottext insert end "$_licount) " $_tag
        _entity_/b
        incr _licount
      }
    }
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_listing
#
# diplay code listing
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_listing {} {
    _entity_pre
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/listing
#
# end code listing
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/listing {} {
    _entity_/pre
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_menu
#
# diplay menu list
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_menu {{args {}}} {
    _entity_ul plain $args
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/menu
#
# end menu list
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/menu {} {
    _entity_/ul
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_ol
#
# begin ordered list
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_ol {{args {}}} {
    _parse_fields ar $args
    if $_left {
      _entity_br
    } else {
      _entity_p
    }
    if {![info exists ar(type)]} {
       set ar(type) 1
    }
    _push licount $_licount
    if [info exists ar(start)] {
       set _licount $ar(start)
    } else {
       set _licount 1
    }
    _push left $_left
    _push left2 $_left2
    if {$_left2 == $_left } {
      incr _left2 [expr {$_indentincr+3}]
    } else {
      incr _left2 $_indentincr
    }
    incr _left $_indentincr
    _push listyle $_listyle
    set _listyle $ar(type)
    _set_tag
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/ol
#
# end ordered list
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/ol {} {
    set _left [_pop left]
    set _left2 [_pop left2]
    set _listyle [_pop listyle]
    set _licount [_pop licount]
    _set_tag
    _entity_p
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_p
#
# paragraph break
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_p {{args {}}} {
  _parse_fields ar $args
  if [info exists ar(align)] {
     _set_align $ar(align)
  } else {
     set _justify L
  }
  _set_tag
  if [info exists ar(id)] {
    set _anchor($ar(id)) [$itk_component(text) index end]
  }
  set x [$_hottext get end-3c]
  set y [$_hottext get end-2c]
  if {$x == "" && $y == ""} return
  if {$y == ""} {
    $_hottext insert end "\n\n"
    return
  }
  if {$x == "\n" && $y == "\n"} return
  if {$y == "\n"} {
    $_hottext insert end "\n"
  return
  }
  $_hottext insert end "\n\n"
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_pre
#
# display preformatted text
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_pre {{args {}}} { 
    _entity_tt
    _entity_br
    incr _pre
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/pre
#
# change state back from preformatted text
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/pre {} {
    _entity_/tt
    set _pre 0
    _entity_p
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_samp
#
# display sample text.
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_samp {} {
    _entity_kbd
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/samp
#
# switch back to non-sample text
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/samp {} {
   _entity_/kbd
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_small
#
# Change current font to a smaller size
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_small {} { 
    _push pointsndx $_pointsndx
    if {[incr _pointsndx -2] < 0} {
       set _pointsndx 0
    }
    _set_tag 
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/small
#
# change current font back from smaller size
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/small {} {
    set _pointsndx [_pop pointsndx]
    _set_tag
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_sub
#
# display subscript
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_sub {} {
    _push offset $_offset
    incr _offset -2
    _entity_small
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/sub
#
# switch back to non-subscript
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/sub {} {
   set _offset [_pop offset]
   _entity_/small
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_sup
#
# display superscript
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_sup {} {
    _push offset $_offset
    incr _offset 4
    _entity_small
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/sup
#
# switch back to non-superscript
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/sup {} {
   set _offset [_pop offset]
   _entity_/small
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_strong
#
# display strong text. (i.e. make font bold)
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_strong {} {
    incr _textweight
    _set_tag
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/strong
#
# switch back to non-strong text
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/strong {} {
    incr _textweight -1
    _set_tag 
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_table
#
# display a table.
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_table {{args {}}} {
    _parse_fields ar $args
    _entity_p
    set _intable 1

    _push row -1
    _push column 0
    _push hottext $_hottext
    _push justify $_justify
    _push justify L
    # push color information for master of table, then push info for table
    _push color $_color
    _push bgcolor $_bgcolor
    _push link $_link
    _push alink $_alink
    if [info exists ar(bgcolor)] {
       set _bgcolor $ar(bgcolor)
    }
    if [info exists ar(text)] {
       set _color $ar(text)
    }
    if [info exists ar(link)] {
       set _link $ar(link)
    }
    if [info exists ar(alink)] {
       set _alink $ar(alink)
    }
    _push color $_color
    _push bgcolor $_bgcolor
    _push link $_link
    _push alink $_alink
    # push fake first row to avoid using optional /tr tag
    # (This needs to set a real color - not the empty string
    # becaule later code will try to use those values.)
    _push color $_color
    _push bgcolor $_bgcolor
    _push link {}
    _push alink {}

    if {[info exists ar(align)]} {
      _set_align $ar(align)
      _set_tag
      _append_text " "
    }
    set _justify L

    if [info exists ar(id)] {
       set _anchor($ar(id)) [$itk_component(text) index end]
    }
    if [info exists ar(cellpadding)] {
       _push cellpadding $ar(cellpadding)
    } else {
       _push cellpadding 0
    }
    if [info exists ar(cellspacing)] {
       _push cellspacing $ar(cellspacing)
    } else {
       _push cellspacing 0
    }
    if {[info exists ar(border)]} {
       _push tableborder 1
       set relief raised
       if {$ar(border)==""} {
          set ar(border) 2
       }
    } else {
       _push tableborder 0
       set relief flat
       set ar(border) 2
    }
    _push table [set table $_hottext.table[incr _counter]]
    iwidgets::labeledwidget $table -foreground $_color -background $_bgcolor -labelpos n
    if {[info exists ar(title)]} {
      $table configure -labeltext $ar(title)
    }
    #
    # create window in text to display table
    #
    $_hottext window create end -window $table

    set table [$table childsite]
    set _anchor($table) [$_hottext index "end - 1 line"]
    $table configure -borderwidth $ar(border) -relief $relief

    if {[info exists ar(width)]} {
        _push tablewidth $ar(width)
    } else {
        _push tablewidth 0
    }
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/table
#
# end table
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/table {} {
  if {$_intable} {
    _pop tableborder
    set table [[_pop table] childsite]
    _pop row
    _pop column
    _pop cellspacing
    _pop cellpadding
    # pop last row's defaults
    _pop color
    _pop bgcolor
    _pop link
    _pop alink
    # pop table defaults
    _pop color
    _pop bgcolor
    _pop link
    _pop alink
    # restore table master defaults
    set _color [_pop color]
    set _bgcolor [_pop bgcolor]
    set _link [_pop link]
    set _alink [_pop alink]
    foreach x [grid slaves $table] {
 	set text [$x get 1.0 end]
 	set tl [split $text \n]
 	set max 0
 	foreach l $tl {
 	    set len [string length $l]
 	    if {$len > $max} {
 	        set max $len
 	    }
 	}
 	if {$max > [$x cget -width]} {
 	    $x configure -width $max
 	}
	if {[$x cget -height] == 1} {
            $x configure -height [lindex [split [$x index "end - 1 chars"] "."] 0]
        }
    }
    $_hottext configure -state disabled
    set _hottext [_pop hottext]
    $_hottext configure -state normal
      if {[set tablewidth [_pop tablewidth]]!="0"} {
	if {[string index $tablewidth \
		 [expr {[string length $tablewidth] -1}]] == "%"} {
          set multiplier [expr {[string trimright $tablewidth "%"] / 100.0}]
	  set idletask [after idle [itcl::code "$this _fixtablewidth $_hottext $table $multiplier"]]
        } else {
          $table configure -width $tablewidth
          grid propagate $table 0
        }
      }
    _pop justify
    set _justify [_pop justify]
    _entity_br
  }
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_td
#
# start table data cell
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_td {{args {}}} {
  if $_intable {
    _parse_fields ar $args
    set table [[_peek table] childsite]
    if {![info exists ar(colspan)]} {
	set ar(colspan) 1
    }
    if {![info exists ar(rowspan)]} {
	set ar(rowspan) 1
    }
    if {![info exists ar(width)]} {
	set ar(width) 10
    }
    if {![info exists ar(height)]} {
	set ar(height) 0
    }
    if [info exists ar(bgcolor)] {
       set _bgcolor $ar(bgcolor)
    } else {
       set _bgcolor [_peek bgcolor]
    }
    if [info exists ar(text)] {
       set _color $ar(text)
    } else {
       set _color [_peek color]
    }
    if [info exists ar(link)] {
       set _link $ar(link)
    } else {
       set _link [_peek link]
    }
    if [info exists ar(alink)] {
       set _alink $ar(alink)
    } else {
       set _alink [_peek alink]
    }
    $_hottext configure -state disabled
      set cellpadding [_peek cellpadding]
      set cellspacing [_peek cellspacing]
    set _hottext $table.cell[incr _counter]
    text $_hottext -relief flat -width $ar(width) -height $ar(height) \
	     -highlightthickness 0 -wrap word -cursor $itk_option(-cursor) \
             -wrap word -cursor $itk_option(-cursor) \
             -padx $cellpadding -pady $cellpadding
    if {$_color != ""} {
        $_hottext config -foreground $_color
    }
    if {$_bgcolor != ""} {
        $_hottext config -background $_bgcolor
    }
    if [info exists ar(nowrap)] {
	$_hottext configure -wrap none
    }
    if [_peek tableborder] {
       $_hottext configure -relief sunken
    }
    set row [_peek row]
    if {$row < 0} {
        set row 0
    }
    set column [_pop column]
    if {$column < 0} {
        set column 0
    }
    while {[grid slaves $table -row $row -column $column] != ""} {
      incr column
    }
    grid $_hottext -sticky nsew -row $row -column $column \
            -columnspan $ar(colspan) -rowspan $ar(rowspan) \
              -padx $cellspacing -pady $cellspacing
    grid columnconfigure $table $column -weight 1
    _push column [expr {$column + $ar(colspan)}]
  if [info exists ar(align)] {
     _set_align $ar(align)
  } else {
      set _justify [_peek justify]
  }
  _set_tag
  }
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/td
#
# end table data cell
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/td {} {
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_th
#
# start table header
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_th {{args {}}} {
    if $_intable {
      _parse_fields ar $args
      if [info exists ar(align)] {
         _entity_td $args
      } else {
         _entity_td align=center $args
      }
      _entity_b
    }
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/th
#
# end table data cell
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/th {} {
  _entity_/td
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_title
#
# begin title of document
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_title {} {
    set _intitle 1 
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/title
#
# end title
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/title {} {
    set _intitle 0
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_tr
#
# start table row
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_tr {{args {}}} {
  if $_intable {
    _parse_fields ar $args
      _pop justify
      if [info exists ar(align)] {
         _set_align $ar(align)
         _push justify $_justify
      } else {
         _push justify L
      }
    # pop last row's colors
    _pop color
    _pop bgcolor
    _pop link
    _pop alink
    if [info exists ar(bgcolor)] {
       set _bgcolor $ar(bgcolor)
    } else {
       set _bgcolor [_peek bgcolor]
    }
    if [info exists ar(text)] {
       set _color $ar(text)
    } else {
       set _color [_peek color]
    }
    if [info exists ar(link)] {
       set _link $ar(link)
    } else {
       set _link [_peek link]
    }
    if [info exists ar(alink)] {
       set _alink $ar(alink)
    } else {
       set _alink [_peek alink]
    }
    # push this row's defaults
    _push color $_color
    _push bgcolor $_bgcolor
    _push link $_link
    _push alink $_alink
    $_hottext configure -state disabled
    _push row [expr {[_pop row] + 1}]
    _pop column
    _push column 0
  }
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/tr
#
# end table row
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/tr {} {
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_tt
#
# Show typewriter text, using the font given by -fixedfont
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_tt {} {
    _push font $_font
    set _font $itk_option(-fixedfont)
    set _verbatim 1
    _set_tag
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/tt
#
# Change back to non-typewriter mode to display text
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/tt {} {
    set _font [_pop font]
    set _verbatim 0
    _set_tag
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_u
#
# display underlined text
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_u {} { 
    incr _underline
    _set_tag
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/u
#
# change back from underlined text
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/u {} { 
    incr _underline -1
    _set_tag
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_ul
#
# begin unordered list
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_ul {{args {}}} {
    _parse_fields ar $args
    if $_left {
      _entity_br
    } else {
      _entity_p
    }
    if [info exists ar(id)] {
      set _anchor($ar(id)) [$itk_component(text) index end]
    }
    _push left $_left
    _push left2 $_left2
    if {$_left2 == $_left } {
      incr _left2 [expr {$_indentincr+3}]
    } else {
      incr _left2 $_indentincr
    }
    incr _left $_indentincr
    _push listyle $_listyle
    _push licount $_licount
    if [info exists ar(plain)] {
      set _listyle none
    } {
      set _listyle bullet
    }
    if [info exists ar(dingbat)] {
      set ar(src) $ar(dingbat)
    }
    _push lipic $_lipic
    if [info exists ar(src)] {
        set _listyle picture
        set _lipic $ar(src)
    }
    _set_tag
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/ul
#
# end unordered list
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/ul {} {
    set _left [_pop left]
    set _left2 [_pop left2]
    set _listyle [_pop listyle]
    set _licount [_pop licount]
    set _lipic [_pop lipic]
    _set_tag
    _entity_p
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_var
#
# Display variable
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_var {} {
    _entity_i
}

# ------------------------------------------------------------------
# PRIVATE METHOD: _entity_/var
#
# change state back from variable display
# ------------------------------------------------------------------
itcl::body iwidgets::Scrolledhtml::_entity_/var {} {
    _entity_/i
}
