text: // ScrollWindow Object
  // a widget that draws layers that are to be scrolled, being built for a new Scroll Object
  // 19991011
  
  // Copyright (C) 1999 Dan Steinman
  // Distributed under the terms of the GNU Library General Public License
  // Available at http://www.dansteinman.com/dynapi/
  
  function ScrollWindow(x,y,width,height,frame,name) {
  	this.name=(name!=null)? name : "ScrollWindow"+(ScrollWindow.count++)
  	this.x=x
  	this.y=y
  	this.w=width
  	this.h=height
  	this.frame=(is.ie && frame!=null)? window.top.frames[frame] : parent
  	this.obj=this.name+"Object"
  	eval(this.obj+"=this")
  	this.setMargins=ScrollWindowSetMargins
  	this.setMargins(0,0,0,0)
  }
  {var p=ScrollWindow.prototype
  p.usebuffer=true
  p.inlineBlocks=0
  p.inc=10
  p.speed=20
  p.border=1
  p.borderColor='black'
  p.bgColor=null
  p.build=ScrollWindowBuild
  p.activate=ScrollWindowActivate
  p.up=ScrollWindowUp
  p.down=ScrollWindowDown
  p.left=ScrollWindowLeft
  p.right=ScrollWindowRight
  p.stop=ScrollWindowStop
  p.getXfactor=ScrollWindowGetXfactor
  p.getYfactor=ScrollWindowGetYfactor
  p.load=ScrollWindowLoad
  p.reload=ScrollWindowReload
  p.back=ScrollWindowBack
  p.forward=ScrollWindowForward
  p.writeContent=ScrollWindowWriteContent
  p.showBlock=ScrollWindowShowBlock
  p.jumpTo=ScrollWindowJumpTo
  p.history=new Array()
  p.historyLoc=-1
  p.historyLen=-1
  p.onScroll=new Function()
  p.onLoad=new Function()
  }
  function ScrollWindowSetMargins(l,r,t,b) {
  	this.marginL=l
  	this.marginR=r
  	this.marginT=t
  	this.marginB=b
  }
  function ScrollWindowBuild() {
  	var w=this.w
  	var h=this.h
  	var b=this.border
  	var bc=this.borderColor
  	var ml=this.marginL
  	var mr=this.marginR
  	var mt=this.marginT
  	var mb=this.marginB
  	this.css=css(this.name,this.x,this.y,w,h,null,null,null,'overflow:hidden')+
  	css(this.name+'Screen',b,b,w-2*b,h-2*b,this.bgColor)
  	if (this.border>0) this.css+=css(this.name+'BorderT',0,0,w,b,bc)+css(this.name+'BorderB',0,h-b,w,b,bc)+css(this.name+'BorderL',0,0,b,h,bc)+css(this.name+'BorderR',w-b,0,b,h,bc)
  	if (this.inlineBlocks) {
  	this.css+=css(this.name+'Content',0,0,w-2*b,null)
  	this.css+=css(this.name+'Block0',ml,mt,w-2*b-ml-mr,null,this.bgColor)
  	for (var i=1;i<this.inlineBlocks;i++) {
  		this.css+=css(this.name+'Block'+i,ml,mt,w-2*b-ml-mr,null,this.bgColor,'hidden')
  	}
  	}
  	else this.css+=css(this.name+'Content',ml,mt,w-2*b-ml-mr)
  	this.divStart=(is.ie && this.usebuffer)? '<iframe name="'+this.name+'Frame" width=0 height=0 style="position:absolute; left:0; top:0; visibility:none"></iframe>\n':''
  	this.divStart+='<div id="'+this.name+'">'+
  	'<div id="'+this.name+'Screen">'
  	if (is.ie && !this.usebuffer) this.divStart+='<iframe name="'+this.name+'Frame" width='+(this.w-2*b-ml-mr)+' height='+(this.h-2*b)+' marginwidth=0 marginheight=0 scrolling="no" frameborder="no"></iframe>\n'
  	else this.divStart+='<div id="'+this.name+'Content">'
  	this.divEnd='</div>'
  	if (is.ns || this.usebuffer) this.divEnd+='</div>'
  	if (this.border>0) this.divEnd+='<div id="'+this.name+'BorderT"></div><div id="'+this.name+'BorderB"></div><div id="'+this.name+'BorderL"></div><div id="'+this.name+'BorderR"></div>\n'
  	this.divEnd+='</div>'
  	this.div=this.divStart+this.divEnd
  }
  function ScrollWindowActivate(w,h) {
  	if (!this.activated) {
  	this.lyr=new DynLayer(this.name)
  	this.screenlyr=new DynLayer(this.name+'Screen')
  	this.blocklyr=new Array()
  	this.blockActive=0
  	}
  	if (this.inlineBlocks) {
  		DynLayerInit()
  		for (var i=0;i<this.inlineBlocks;i++) this.blocklyr[i]=new DynLayer(this.name+'Block'+i)
  	}
  	if (is.ie && this.usebuffer && this.frame.frames[this.name+'Frame'].document.body.innerHTML) document.all[this.name+'Content'].innerHTML=this.frame.frames[this.name+'Frame'].document.body.innerHTML
  	if (this.inlineBlocks) {
  	this.contentlyr=this.blocklyr[this.blockActive]
  	}
  	else if (is.ie && !this.usebuffer) this.contentlyr=new DynLayer('content',null,this.frame.frames[this.name+'Frame'])
  	else this.contentlyr=new DynLayer(this.name+'Content')
  	var c=this.contentlyr
  	c.onSlide=new Function(this.obj+'.onScroll()')
  	this.contentHeight=h||((is.ns)?c.doc.height:c.elm.scrollHeight)
  	this.contentWidth=w||((is.ns)?c.doc.width:c.elm.scrollWidth)
  	if (is.ns) {
  		c.css.clip.bottom=Math.max(this.contentHeight,this.h)
  		c.css.clip.right=Math.max(this.contentWidth,this.w)
  	}
  	this.offsetHeight=this.contentHeight+this.marginT+this.marginB-this.screenlyr.h
  	this.offsetWidth=this.contentWidth+this.marginL+this.marginR-this.screenlyr.w
  	this.enableVScroll=(this.offsetHeight>0)
  	this.enableHScroll=(this.offsetWidth>0)
  	this.onScroll()
  	this.onLoad()
  	this.activated=true
  }
  function ScrollWindowLoad(url) {
  	if (url != this.url) {
  	this.historyLoc+=1
  	this.historyLen=this.historyLoc
  	this.history[this.historyLen]=url
  	}
  	this.reload(0)
  }
  function ScrollWindowBack() {
  	if (this.historyLoc>0) this.reload(-1)
  }
  function ScrollWindowForward() {
  	if (this.historyLoc<this.historyLen) this.reload(1)
  }
  function ScrollWindowReload(i) {
  	this.historyLoc+=i
  	this.url=this.history[this.historyLoc]
  	this.refresh=true
  	this.contentlyr=new DynLayer(this.name+'Content')
  	this.contentlyr.moveTo(this.marginL,this.marginT)
  	if (is.ns) {
  		if (this.inlineBlocks) this.contentlyr.elm.load(this.url,this.w-2*this.border)
  		else this.contentlyr.elm.load(this.url,this.w-2*this.border-this.marginL-this.marginR)
  	}
  	else this.frame.frames[this.name+'Frame'].document.location=this.url
  }
  function ScrollWindowUp() {
  	if (this.enableVScroll) this.contentlyr.slideTo(null,this.marginT,this.inc,this.speed)
  }
  function ScrollWindowDown() {
  	if (this.enableVScroll) this.contentlyr.slideTo(null,-this.offsetHeight+this.marginT,this.inc,this.speed)
  }
  function ScrollWindowLeft() {
  	if (this.enableHScroll) this.contentlyr.slideTo(this.marginL,null,this.inc,this.speed)
  }
  function ScrollWindowRight() {
  	if (this.enableHScroll) this.contentlyr.slideTo(-this.offsetWidth+this.marginL,null,this.inc,this.speed)
  }
  function ScrollWindowStop() {
  	if (this.activated) this.contentlyr.slideActive=false
  }
  function ScrollWindowGetXfactor() {
  	if (this.offsetWidth==0) return 0
  	return Math.min((this.offsetWidth-this.contentlyr.x+this.marginL)/this.offsetWidth-1,1)
  }
  function ScrollWindowGetYfactor() {
  	if (this.offsetHeight==0) return 0
  	return Math.min((this.offsetHeight-this.contentlyr.y+this.marginT)/this.offsetHeight-1,1)
  }
  function ScrollWindowWriteContent(doc) {
  	if (is.ie) doc.write(css('content',0,0,this.w-2*this.window.border))
  }
  function ScrollWindowShowBlock(i,fn) {
  	if (this.blockActive!=i) {
  	this.blockActive=i
  	this.contentlyr.moveTo(this.marginL,this.marginT)
  	this.contentlyr.hide()
  	this.blocklyr[i].css.visibility='inherit'
  	this.activate()
  	eval(fn)
  	}
  }
  function ScrollWindowJumpTo(x,y) {
  	this.contentlyr.moveTo((x!=null)?Math.max(-x,-this.offsetWidth):null,(y!=null)?Math.max(-y,-this.offsetHeight):null)
  	this.onScroll()
  }
  ScrollWindow.count=0
  