#===================================================================
# TCaster -- The Tcl Global Information Agent
#  by Mike Doyle, Hattie Schroeder and Clif Flynt
#       
#  Copyright (c) 1997 Eolas Technologies Inc., portions covered by U.S. Patent 4,847,604
#  Freely modifiable/redistributable under the "Standard Tcl License"
#  See http://www.eolas.com/tcl/license.txt for details
#===================================================================
#
#
# This program calls upon several procedures in the "spynergy.tcl"
# toolkit to handle rendering and navigation of Web pages from within 
# a standard test widget.
#
# These procedures include:
#
#   HB_init {win}:  Called with the name of the
#    text window to be used for rendering the Web page.  It sets up 
#    a group of variables that allow GUI widgets to be attached to
#    the various URL navigational functions in the Spynergy library.
#
#   HB_resolve_url {win url}:  Transforms relative URL
#    pathnames into absolute pathnames that the HTML library functions
#    can handle.  The relative URL is passed as an argument, and the 
#    procedure returns the absolute URL in string form.
#    
#   HB_load_url {win url}:  Loads the given URL into 
#    the text widget defined by "win"
#
#   HB_home {button_path}:  Loads the default home URL
#    into the text widget specified in HB_init
#
#   HB_back {button_path}:  Causes re-loading of the URL which 
#    immediatly preceded the URL being currently viewed, if applicable
#
#   HB_forward {button_path}:  If the Back button has been pushed, this 
#    causes re-loading of the URL which immediately follows the URL being
#    currently viewed
#
#   HB_go_form {button_path}:  Causes the display of a scrolling listbox
#    that displays a "history list" of all of the URLs that the user has
#    visited.  Clicking on any URL in the list will cause that URL to be
#    immediately fetched and rendered into the text widget defined by HB_init
#
#   HB_Stop {button_path}:  This procedure will interrupt the fetching
#    and rendering of HTML data into the Web browser text widget.
# 
#
#
#
#===================================================================


set strip {
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
iPOeROeMR6B9djD3/k4yRnXnzCAAOvVLeQVS+NoszjHkXkQ6nUPRYuhlNCJ7gIR0okk7jcXi
drW0p1VpawHoVYo8LSdiMi/6x1Zp+Jj0wo814tfikDg2KONtX60hgYp02GhhcDnuwyEi8yV2
wIRN3tifiRs++A9PR5CppXNc/pcmSspBcuB6UBYpZYdAZnmnmRqG4eWSdOKXl0YPEHlmoHI+
ReiBF1AQU6KA5sKoinelZ2FRL/zZpaV8DlShAZHSIhlInqKoZo0rObkRPfVwMtxalaY6J2sr
tXSMi1aIBtGOMQqqKqFl5TXUpv2N5lB0DiF5ma3YEStUpAm9IJl7N0EzmFcvqCkEa9mY/jWt
PNU2MMJss0Z3pFvm5DYXBZvdFe5er4r2F2AlEcatauVh59lL4tKrVow4tTCjGrrVJZCdKcxL
rsBb7VDcj6up5FqrMvVKm2mDDVBtbo0Gg6VvQm4pg6xKFffVAzpM8K6jQF086bKVxaeyuxTH
GzOeioaUcrstSxjkY7DBsDOloNT8MwUSGigqBU/2UG6UaOpkM9AfjrkwaON2GmetLC+NNZta
T/HqJvjo4yvVBgtbX29kk4i2hmoH+yymOv+JbqUFN0Wjo6Lu2jUYPDpQsLMg9ws41Bnus3GA
g34Lt8xei7Kt0pvZ12fgjFN++JVjK15ynmt7DmSIeHPu4NeX/gpdZup6+v2txa7DqTrbdreu
6+K1ww554vlVlYnUoy+6Op9NqjcLX6+TvueqdlrwpLVq9y7srWW1yhGyAxd/O+ICReum8DV5
IhI/MvTte0/RQobozuYP7rjzL5uFEKKy5SkSvrjhvo42xdrvKuaS1Xcs44/5MMI88QLgvGSD
Dy/caxeo6dbfttG+qzxMWb8yDdsQ9jzANdBUGoOPtmh0nQgwJlQki40INcYUUsyjf77Rjvig
dDKaaUtAdPFWv4DSkhp2TTrxEQ99fpcrPzFvZtP5GX3OQybdiU5RtMohEZmmuQRNzna8qKLY
Ttecoi0jJ6fqnFMi1MU23akvRaLe/vlKh7m3he5NfinNd1jwKSZJzmjo8lXdvtc6IDKPR82a
X+TimMVnSMwwjVLM3Wg3te45qzo4qA/oVnjI5sVOTJVEHe8wqb46RMKQRkOV91iHjZ/U4Id7
AMcfmkGpQpgBDedwAzAcccolNCEWUWBlFlz5npIcYpbVsGUrUlkJPmSilYH4ZSiCmQhaNqIG
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
}

proc zmap_setup {} {
    global strip which nFrames delayInterval zwin oldurl zmap_url _url
    set width 50
    set which 0

    image create photo strip -data $strip
    label $zwin.l -border 0; pack $zwin.l

    set nFrames [expr [image width strip] / $width]

    for {set i 0} {$i < $nFrames} {incr i} {
	image create photo p$i
	p$i copy strip -from [expr $i * $width] 0 [expr ($i + 1) * $width] 50
    }
    set which 0

}

proc zmap_playnext {} {
    global nFrames which delayInterval zwin

    incr which
    if {$which >= $nFrames} {set which 0}
    $zwin.l configure -image p$which
	after $delayInterval zmap_playnext
}


#======================================================================
#: Start of stock retrieval subsection

#======================================================================
#:: doticker {textWindow delay text width} 
#: Displays individual strings in a list of messages as horizontally 
#: scrolling text, with a particular header above the line.
#:
#: textWindow	- The text window in which to display the string
#: delay	- Time to wait each character in scroll
#: text		- A separator string to place between messages
#: width	- The maximum width of the text window.

proc doticker {textWindow delay text width} {
    global index messages header once

    # Find the locatio of the last character on the second line
    # and if that is less than the possible last character,
    # add a new set of strings to the scrolling text in the window.

    scan [$textWindow index 2.end] %d.%d line len

    if {$len < $width} {
	if {![info exists messages($index)]} {
	    set index 0
	}
	set message $messages($index)

	$textWindow configure -state normal
	$textWindow insert 1.end "$text" fill
	$textWindow insert 1.end $header

	# Need a \n at the end of the line 1 to insert on line 2.

	if {$len == 0} {
	    $textWindow insert 1.end "\n" 
	  }

	$textWindow insert 2.end "$text" fill
	$textWindow insert 2.end $message tag$index
	$textWindow configure -state disabled

	incr index
    }

    # Delete the first characters in the first and second line,
    # to scroll the text one position to the left.

    $textWindow configure -state normal
    $textWindow delete 2.0
    $textWindow delete 1.0
    $textWindow configure -state disabled
    after $delay [list doticker $textWindow $delay $text $width]
}


#======================================================================
#:: reformTable {lst}
#: Takes a list composed of lines (one line per list item) as returned
#:   by a webserver, and returns a list composed of one Table Row per
#:   list entry.
#:  ie:
#:  input:
#:    
#:      one two
#:    
#:  output:
#:   one two 
#:
#: lst		- A list of lines from a webserver, one list entry
#:		  per line. - set lst [split $input "\n"]

proc reformTable {lst} {
  global debug;
    if {$debug} {puts "reformTable: $lst"}
    
    if {[string length $lst] < 5} {return ""}
    set tdState 0
    set tdline ""
    
    #
    # Loop through the list items checking for Table markers ( 
    # Append the text between  and  (inclusive) into a single
    #   list item in a new list.
    #
    # The automata is in one of these states:
    # 
    #  0) No  2} {
	            if {$debug} {puts "tdState: $tdState -- LINE: $line"}
		    if {([string first "= 0} {
	        if {$debug} {puts "TD : $tdState -- $line" }
		set st2 [expr $st1+4]
		set tdline [string range $line $st1 $st2]
		set line [string range $line $st2 end]
		set tdState 1
	    }

	    # If there is a  should be transfered to the holding space,
	    # before the holding string is lappended to the list
	    # of table definitions.

	    if {[set st1 [string first "= 0} {
	        if {$debug} {puts "/TD : $tdState -- $line" }
		set st2 [expr $st1+5]
		if {$tdState} {
		    append tdline [string range $line 0 $st2]
		    lappend tdlst $tdline
		    set tdline ""
		    set tdState 0
		}
		set line [string range $line $st2 end]
	    }
	}
    }
    return $tdlst
}

#======================================================================
#:: extractNumber {line} 
#: extracts a number from the data in a line
#: line		- A line in the rough format ...> ## ##/##  <...

proc extractNumber {line} {
    # The numeric values are extracted using a regular expression that
    # looks for a string of numbers between a ">", and a "<"

    set xx [regexp {>([	 ]*)([0-9%\./-]+ *[0-9%\./-]*)([ 	]*)<} $line \
      mat p1 p2 p3]
    if {$xx == 0} {
      puts "FAILED TO FIND NUMBER IN: $line"
      return "XX"
      } else {
      return $p2
      }
  }

#======================================================================
#:: readstocks {stock_list}
#:  Reads a set of stocks from a list of ticker symbols.
#:  stock_list -	The list of stock ticker symbols.
#:
#: NOTE: This proc contains many heuristics based on the format of
#:       the html page generated by www.newsalert.com.  Other formats
#:       will require modifications to the heuristics for extracting
#:       the stock price information.
#:
#:       For a discussion on building heuristics for extracting
#:       information from web pages, see: 
#:
#:	 A Scalable Comparison-Shopping Agent for the World-Wide Web
#:	 Doorenbos, Etzionis & Weld
#:  	 Proceedings of the First Internation Conference on Autonomous Agents
#:	 ACM, 1997

proc readstock {symbol} {
global messages debug formatstr

    # Convert the symbol to upper case for later comparisons.
    set upsym [string toupper $symbol]

    # Get the page of data from newsalert.com

    set data [fetchURL http://www.newsalert.com/free/stocknews?Symbol=$symbol \
    		-initialtimeout 45 -timeout 15]
    
    if {[string first "$upsym not found" $data] != -1} {
      puts "$upsym was not found!"
      return "";
      }

    # Extract the table with the stock values from the output.
    # This is the portion of the data between Symbol=XXX and the end of the
    # table.

    set st1 [string first "Symbol=$symbol" $data]
    set st2 [string first "" $data]
    incr st1
    set data [string range $data $st1 $st2]

    # Skip the first two rows in the table.

    set st1 [string first "" $line]
    set line [string range $line $st1 end]
    set st1 [string first ">" $line]
    set st2 [string first "<" $line]
    incr st1
    incr st2 -1

    #  puts "st1: $st1 st2: $st2 line: $line"
    set company [string range $line $st1 $st2]"

    # The numeric values are extracted using a regular expression that
    # looks for a string of numbers between a ">", and a "<"

    set last [extractNumber [lindex $tdlst 3]]
    set chg  [extractNumber [lindex $tdlst 4]]
    set pct  [extractNumber [lindex $tdlst 5]]
    set open [extractNumber [lindex $tdlst 7]]
    set high [extractNumber [lindex $tdlst 8]]
    set low  [extractNumber [lindex $tdlst 9]]

  set stockinfo [format $formatstr \
      $upsym [string range $company 0 11] $last $chg $pct $open $high $low]

  return $stockinfo
}

#======================================================================
#::  displayStocks {stock_list win} 
#: displays a list of stocks in the appropriate window.
#: Initializes the message list for the display
#:
#: stock_list	- A list of the ticker symbols of stocks to display
#: win		- The window in which to display the stock readings.

proc displayStocks {stock_list win} {
  global messages header index debug
  wm title .rouser "Tcaster: Fetching stock quotes"

  foreach symbol $stock_list {
    set x [readstock $symbol]
    if {$x != ""} {
      set in  [expr [lsearch -exact $stock_list $symbol]]
      set messages($in) "$x"	   
  
      #comment out the following line if you don't want the stock data 
      #  echo'ed to the console
      puts $messages($in)
      doticker $win 1500 "  ******  " 250
      }
    }
  wm title .rouser "Tcaster: The Tcl news center"
  after 900000 "displayStocks [list $stock_list] $win"
}

#======================================================================
#:: init_ticker {win} 
#:  initialize the stock ticker.  Creates the window and loads the stocks.
#:  win		- Parent window for the text window.

proc init_ticker {win} {

  # Define the globals that the stock subsystem uses, and initialize them.

  global debug index messages header formatstr
 
  set debug 0; set index 0; set messages(0) ""; set header "";

  set formatstr "%-10s %-12s %10s %10s %12s %12s %12s %12s"

  set header [format $formatstr \
  	Symbol "Company Name" Lst Chg Pct Open High Low ]

  text $win.t -relief ridge -bd 2 -wrap none \
            -bg black -fg green -state disabled -height 2

  set stock_list [list aapl gwrx ibm mot msft nscp pkt spyg sunw]

  displayStocks $stock_list $win.t
}

# End of stocks subsection
#======================================================================


#########################################
# Fetch the weather map
#
proc fetch_map {} {
	global weather fetcherr
	wm title .rouser "Tcaster: Fetching weather map"
	catch "fetchURL -url http://www.weatherpoint.com/wximages/jotrad.gif -outfile weathermap.gif"
	if {[info exists $weather]} {image delete $weather}
	catch "set weather [image create photo -file "weathermap.gif" -gamma 1 -height 484 -width 756 -palette 5/5/4]"
	.rouser.main.top.buttons.show_weather.win.label configure -image $weather
	wm title .rouser "Tcaster: The Tcl news center"
	after 900000 fetch_map

}

proc show_time {} {

wm title .rouser.main.top.buttons.show_weather.win "Doppler Radar: Illinois -- Updates every 15 minutes -- [clock format [clock seconds]]"
after 1000 show_time

}


source spynergy.tcl

##############################
# Rouser Configuration Section  
# This section allows you to set several configuration options, such as the default
# URL that the browser loads at satartup, Whether or not to display the navigation
# buttons and URL window, the default color of the HTML document background, 
# the default color and width of the frame surrounding the Web page, and whether 
# or not to display a scrollbar at the right of the document window.

global ROUSERURL BASE BUTFLAG BORDWID BG index messages header once zmap_url
global FRMBG SCROLFLAG FILLAREA weather zwin which oldurl delayInterval
# -- Rouser configuration variables for .rouser.f1
set delayInterval 100
set zmap_url "http://www.doyles.com/cgi-dos/mapper.cmd/demo@world@world.tif?"
set ROUSERURL(1) "http://www.usnews.com/usnews/news/ap-alert.htm"
set BASE(1) .rouser.main
set BUTFLAG(1) "1"
set BORDWID(1) "0"
set FILLAREA(1)  "0"
set BG(1) "white"
set FRMBG(1) "LightGray"
set SCROLFLAG(1) "1"
### End of Rouser Configuration Section

##############################
# -- embed_arg override processing for Rouser defaults from within plugin
#
global embed_args
if {[info exists embed_args]} {
    foreach key [array names embed_args] {
        set embed_args([string toupper $key]) $embed_args($key)
    }
    foreach em_url [array names embed_args ROUSERURL*] {
        if {$em_url == "ROUSERURL"} {
            set ROUSERURL(1) "$embed_args($em_url)"
        } else {
            set i [string range $em_url 12 end]
            set ROUSERURL($i) "$embed_args($em_url)"
        }
    }
    unset em_url
    foreach em_butf [array names embed_args BUTTONS*] {
        if {$em_butf == "BUTTONS"} {
            set BUTFLAG(1) "$embed_args($em_butf)"
        } else {
            set i [string range $em_butf 7 end]
            set BUTFLAG($i) "$embed_args($em_butf)"
        }
    }
    unset em_butf
    foreach em_bord [array names embed_args BORDERWIDTH*] {
        if {$em_bord == "BORDERWIDTH"} {
            set BORDWID(1) "$embed_args($em_bord)"
        } else {
            set i [string range $em_bord 11 end]
            set BORDWID($i) "$embed_args($em_bord)"
        }
    }
    unset em_bord
    foreach em_bg [array names embed_args BACKGROUND*] {
        if {$em_bg == "BACKGROUND"} {
            set BG(1) "$embed_args($em_bg)"
        } else {
            set i [string range $em_bg 10 end]
            set BG($i) "$embed_args($em_bg)"
        }
    }
    unset em_bg
    foreach em_frmbg [array names embed_args FRAMEBACKGROUND*] {
        if {$em_frmbg == "FRAMEBACKGROUND"} {
            set FRMBG(1) "$embed_args($em_frmbg)"
        } else {
            set i [string range $em_frmbg 15 end]
            set FRMBG($i) "$embed_args($em_frmbg)"
        }
    }
    unset em_frmbg
    foreach em_srf [array names embed_args SCROLLBARS*] {
        if {$em_srf == "SCROLLBARS"} {
            set SCROLFLAG(1) "$embed_args($em_srf)"
        } else {
            set i [string range $em_srf 3 end]
            set SCROLFLAG($i) "$embed_args($em_srf)"
        }
    }
    unset em_srf
    foreach em_fill [array names embed_args FILLAREA*] {
        if {$em_fill == "FILLAREA"} {
            set FILLAREA(1) "$embed_args($em_fill)"
        } else {
            set i [string range $em_fill 8 end]
            set FILLAREA($i) "$embed_args($em_fill)"
        }
    }
    unset em_srf
}

##############################
#-----This section sets up the GUI-----

set Name .rouser
catch "destroy .rouser"
    toplevel $Name     -background LightGray
    wm title $Name "Tcaster: The Tcl news center"
    wm geometry $Name 624x447
    wm geometry $Name +20+20
    wm withdraw $Name

set Parent $Name

##############################


set Name $Parent.main
frame $Name     -relief ridge
pack $Name -anchor nw -side top -expand yes -fill both

set Name $Parent.main.top
frame $Name     -background LightGray \
    -borderwidth 2 \
    -height 50 \
    -relief raised \
    -width 50
pack $Name     -side top

set Name $Parent.main.top.buttons
frame $Name     -background LightGray
pack $Name     -anchor nw \
    -expand 1 \
    -fill x \
    -side top

##############################
#-----The Back button-----
#
set Name $Parent.main.top.buttons.back
button $Name     -activebackground  gray40 \
    -activeforeground green \
    -background gray40 \
    -command "HB_back $Parent.main.top.buttons.back" \
    -disabledforeground LightGray \
    -foreground White \
    -highlightbackground LightGray \
    -highlightcolor LightGray \
    -padx 5 \
    -pady 1 \
    -text Back
pack $Name     -anchor nw \
    -fill none \
    -side left

##############################
#-----The Forward button-----
#
set Name $Parent.main.top.buttons.forward
button $Name     -activebackground gray40 \
    -activeforeground green \
    -background gray40 \
    -command "HB_forward $Parent.main.top.buttons.forward" \
    -disabledforeground LightGray \
    -foreground White \
    -highlightbackground LightGray \
    -highlightcolor LightGray\
    -padx 5 \
    -pady 1 \
    -text Forward
pack $Name     -anchor nw \
    -fill none \
    -side left

##############################
#-----The Home button-----
#
set Name $Parent.main.top.buttons.home
button $Name     -activebackground gray40 \
    -activeforeground green \
    -background gray40 \
    -command "HB_home $Parent.main.top.buttons.home" \
    -disabledforeground LightGray \
    -foreground White \
    -highlightbackground LightGray \
    -highlightcolor LightGray \
    -padx 5 \
    -pady 1 \
    -text Home
pack $Name     -anchor nw \
    -fill none \
    -side left

##############################
#-----The Go button (pops up the history listbox)-----
#
set Name $Parent.main.top.buttons.go
button $Name     -activebackground gray40 \
    -activeforeground green \
    -background gray40 \
    -command "HB_go_form $Parent.main.top.buttons.go" \
    -disabledforeground LightGray \
    -foreground White \
    -highlightbackground LightGray \
    -highlightcolor LightGray \
    -padx 5 \
    -pady 1 \
    -text Go
pack $Name     -anchor nw \
    -fill none \
    -side left

##############################
#-----The Show Ticker button-----
#

set show_tick 1
set Name $Parent.main.top.buttons.ticker
button $Name     -activebackground gray40 \
    -activeforeground green \
    -background gray40 \
    -command  {
		if {$show_tick} { 
		pack .rouser.main.txt.ticker.t -expand 1 -fill x
 		pack .rouser.main.txt.ticker -anchor nw -side bottom -expand 1 -fill x \
			-before .rouser.main.txt.win
 		.rouser.main.top.buttons.ticker configure -text "Hide Ticker"
		set show_tick 0
		} else {
		pack forget .rouser.main.txt.ticker 
		.rouser.main.top.buttons.ticker configure -text "Show Ticker"
		set show_tick 1
          	       }}  \
    -disabledforeground LightGray \
    -foreground White \
    -highlightbackground LightGray \
    -highlightcolor LightGray \
    -padx 5 \
    -pady 1 \
    -text "Show Ticker"
pack $Name     -anchor nw -fill none -side left

##############################
#-----The Show Weather button-----
#
set Name $Parent.main.top.buttons.show_weather


set show_weather 1
set weather ""
button $Name     -activebackground gray40 \
    -activeforeground green \
    -background gray40 \
    -command  {
 	if {$show_weather} { 
      wm deiconify .rouser.main.top.buttons.show_weather.win
	raise .rouser.main.top.buttons.show_weather.win
      .rouser.main.top.buttons.show_weather configure -text "Hide Weather"
	set show_weather 0
	} else {
      wm withdraw .rouser.main.top.buttons.show_weather.win 
       .rouser.main.top.buttons.show_weather configure -text "Show Weather"
       set show_weather 1
 	}	
                	       }  \
    -disabledforeground LightGray \
    -foreground White \
    -highlightbackground LightGray \
    -highlightcolor LightGray \
    -padx 5 \
    -pady 1 \
    -text "Show Weather"
pack $Name     -anchor nw  -fill none  -side left
  	toplevel $Name.win     -background LightGray
    	wm title $Name.win "Rouser Doppler Radar -- Updates every 15 minutes"
	wm withdraw $Name.win
	show_time
	label $Name.win.label -border 0
 	pack $Name.win.label 		
   	$Name.win.label configure -image $weather
	button $Name.win.closebut -text Close -command {
		wm withdraw .rouser.main.top.buttons.show_weather.win
		pack forget .rouser.main.top.buttons.hide_weather
		pack .rouser.main.top.buttons.show_weather -anchor nw  -fill none  -side left \
		-before .rouser.main.top.buttons.stop
		}
	pack $Name.win.closebut -side right -anchor e

	button $Name.win.refresh -text "Refresh Now" -command {
		fetchURL -url http://www.weatherpoint.com/wximages/jotrad.gif -outfile weathermap.gif
		image delete $weather
		set weather [image create photo -file "weathermap.gif" -gamma 1 -height 484 -width 756 -palette 5/5/4]
		.rouser.main.top.buttons.show_weather.win.label configure -image $weather
		}
	pack $Name.win.refresh -side left -anchor e


################################
#-----The Stop button-----
#
set Name $Parent.main.top.buttons.stop
button $Name     -activebackground gray40 \
    -activeforeground red \
    -background gray40 \
    -command "HB_Stop $Parent.main.top.buttons.stop" \
    -disabledforeground LightGray \
    -foreground White \
    -highlightbackground LightGray \
    -highlightcolor LightGray \
    -padx 5 \
    -pady 1 \
    -text Stop
pack $Name     -anchor nw \
    -fill none \
    -side left


set Name $Parent.main.top.buttons.l22
label $Name     -anchor w \
    -background LightGray \
    -foreground white \
    -justify left
pack $Name     -anchor nw \
    -fill none \
    -side left

set Name $Parent.main.top.buttons.status
label $Name     -anchor w \
    -background LightGray \
    -foreground white \
    -justify left
pack $Name     -anchor nw \
    -fill none \
    -side left

##############################


#-----The Exit button-----
set Name $Parent.main.top.buttons.exit
button $Name     -activebackground lavender \
    -background gray40 \
    -command exit \
    -foreground white \
    -highlightbackground LightGray \
    -text Exit
pack $Name -anchor nw -side right


##############################
#----The zMap animation window------
#
set Name $Parent.main.top.zmap
frame $Name   -background LightGray -border 1
pack $Name    -anchor w \
    -expand 0 \
    -fill x \
    -side right

scale $Parent.main.top.zmap.scale -from 1 -to 4000 -orient vertical -width 8 -sliderlength 8 \
	-tickinterval 0 -length 47  -variable delayInterval -showvalue 0 -borderwidth 0 \
	-troughcolor gray40
pack $Parent.main.top.zmap.scale -side left

set zwin $Name
zmap_setup
zmap_playnext

##############################
#-----The URL frame-----
#
set Name $Parent.main.top.ubar
frame $Name     -background LightGray
pack $Name     -anchor nw \
    -expand 1 \
    -fill x \
    -side top

##############################
#-----The URL label to the left of the URL entry widget-----
#
set Name $Parent.main.top.ubar.l13
label $Name     -background LightGray \
    -foreground black \
    -text URL:
pack $Name     -anchor w \
    -side left

##############################
#----The URL entry widget------
#
set Name $Parent.main.top.ubar.url
entry $Name     -background white \
    -highlightbackground LightGray \
    -highlightcolor cyan \
    -selectbackground skyblue \
    -width 0
pack $Name     -anchor nw \
	-expand yes \
    -fill x \
    -side left


set Name $Parent.main.txt
frame $Name     -background LightGray \
    -borderwidth 2 \
    -highlightbackground lightgray \
    -relief raised
pack $Name     -anchor nw \
    -expand 1 \
    -fill both \
    -side top
frame .rouser.main.txt.ticker -height 10
pack .rouser.main.txt.ticker -anchor nw -side bottom -expand 1 -fill x
##############################
#-----The text widget that displays the Web document-----
#
set Name $Parent.main.txt.win
text $Name     -background white \
    -cursor arrow \
    -foreground black \
    -height 100 \
    -highlightbackground lightgray \
    -insertbackground black \
    -selectbackground LightGray \
    -selectforeground black \
    -takefocus 0 \
    -width 20 \
    -yscrollcommand "$Parent.main.txt.scroll set"
$Name insert end {





}
pack $Name     -anchor nw \
    -expand 1 \
    -fill both \
    -padx 2 \
    -pady 2 \
    -side left

set Name $Parent.main.txt.scroll
scrollbar $Name     -activebackground plum \
    -activerelief sunken \
    -background LightGray \
    -command "$Parent.main.txt.win yview" \
    -highlightbackground LightGray \
    -troughcolor gray40 -width 16
pack $Name     -anchor center \
    -fill y \
    -padx 2 \
    -pady 2 \
    -side right

	set win $Parent.main.txt.win
	global _url level

	set base .rouser.main 
	set _url($win~~statuslabel) "$base.top.buttons.status"
	set _url($win~~entrywidget) "$base.top.ubar.url"
	set _url($win~~backbut)     "$base.top.buttons.back"
	set _url($win~~forwardbut)  "$base.top.buttons.forward"
	set _url($win~~homebut)     "$base.top.buttons.home"
	set _url($win~~gobut)       "$base.top.buttons.go"
	set _url($win~~stopbut)     "$base.top.buttons.stop"






##############################
# ----- Load HTML into the browser text widget -------
#
proc LoadHTML {w url} {
    global _url 
 
    HB_init $w
    if {$url != ""} {
        $_url($w~~entrywidget) configure -text $url
        update
        set urllist [HB_resolve_url $w $url]
        HB_load_url $w [lindex $urllist 0] [lindex $urllist 1] 1
        if {[lindex $urllist 1] != ""} {HMgoto [lindex $urllist 1]}
    }
}

##############################
# ----- Post browser text widget -------
#
wm deiconify .rouser
if {!$BUTFLAG(1)} {
    pack forget .rouser.main.top		
} else {
    pack .rouser.main.top -before .rouser.main.txt -anchor nw -expand 1 -fill x -side top
}
if {!$SCROLFLAG(1)} {
    pack forget .rouser.main.txt.scroll
} else {
    pack .rouser.main.txt.scroll -after .rouser.main.txt.win -anchor center -expand 0 -fill y -padx 2 -pady 2 -side right
}
.rouser.main configure -borderwidth $BORDWID(1)
.rouser.main.txt configure -background $FRMBG(1)
.rouser.main.txt.win configure -background $BG(1)
if {$FILLAREA(1)} {
    place .rouser.f1 -x 0 -y 0 -width 0 -height 0 -relx 0 -rely 0 -relwidth 1.0 -relheight 1.0 -anchor nw
}
update
if {$ROUSERURL(1) != ""} {
    LoadHTML .rouser.main.txt.win "$ROUSERURL(1)"
}

  bind $Parent.main.top.zmap.l  {set oldurl [.rouser.main.top.ubar.url get]
 			.rouser.main.top.ubar.url delete 0 end
			.rouser.main.top.ubar.url insert end "$zmap_url"}
  bind $Parent.main.top.zmap.l  {
		set zmap_x [winfo pointerx $zwin.l]
		set zmap_y [winfo pointery $zwin.l]
		.rouser.main.top.ubar.url delete 62 end
		.rouser.main.top.ubar.url insert end "%x,%y,"
		}
    bind $Parent.main.top.zmap.l  {
		.rouser.main.top.ubar.url delete 62 end
		.rouser.main.top.ubar.url insert end "%x,%y,$which"
		HB_init $win
		set _url($win~~histidx) -1
		set _url($win~~lasturl) "*"
	 	   set urllist [HB_resolve_url $win [$_url($win~~entrywidget) get]]
		set turl "[lindex $urllist 0][lindex $urllist 2]"
                 	   HB_load_url $win $turl [lindex $urllist 1]
		.rouser.main.top.ubar.url delete 0 end
		.rouser.main.top.ubar.url insert end "$zmap_url"
		}
    bind $Parent.main.top.zmap.l  {
 		 LoadHTML .rouser.main.txt.win "http://www.eolas.com/metamap"

		} 
   bind $Parent.main.top.zmap.l  {
		.rouser.main.top.ubar.url delete 0 end
		.rouser.main.top.ubar.url insert end "$oldurl"
		}

init_ticker .rouser.main.txt.ticker
fetch_map
#
#------< End of File >-----