186 lines
6.6 KiB
JavaScript
186 lines
6.6 KiB
JavaScript
// 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.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
|