JD_v1/addons/scrollwindow.js
2021-09-12 22:38:30 +02:00

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