Position.js
257 lines
| 8.0 KiB
| application/javascript
|
JavascriptLexer
Brian E Granger
|
r1234 | /*** | |
MochiKit.Position 1.4 | |||
See <http://mochikit.com/> for documentation, downloads, license, etc. | |||
(c) 2005-2006 Bob Ippolito and others. All rights Reserved. | |||
***/ | |||
if (typeof(dojo) != 'undefined') { | |||
dojo.provide('MochiKit.Position'); | |||
dojo.require('MochiKit.Base'); | |||
dojo.require('MochiKit.DOM'); | |||
dojo.require('MochiKit.Style'); | |||
} | |||
if (typeof(JSAN) != 'undefined') { | |||
JSAN.use('MochiKit.Base', []); | |||
JSAN.use('MochiKit.DOM', []); | |||
JSAN.use('MochiKit.Style', []); | |||
} | |||
try { | |||
if (typeof(MochiKit.Base) == 'undefined' || | |||
typeof(MochiKit.Style) == 'undefined' || | |||
typeof(MochiKit.DOM) == 'undefined') { | |||
throw ''; | |||
} | |||
} catch (e) { | |||
throw 'MochiKit.Style depends on MochiKit.Base, MochiKit.DOM, and MochiKit.Style!'; | |||
} | |||
if (typeof(MochiKit.Position) == 'undefined') { | |||
MochiKit.Position = {}; | |||
} | |||
MochiKit.Position.NAME = 'MochiKit.Position'; | |||
MochiKit.Position.VERSION = '1.4'; | |||
MochiKit.Position.__repr__ = function () { | |||
return '[' + this.NAME + ' ' + this.VERSION + ']'; | |||
}; | |||
MochiKit.Position.toString = function () { | |||
return this.__repr__(); | |||
}; | |||
MochiKit.Position.EXPORT_OK = []; | |||
MochiKit.Position.EXPORT = [ | |||
]; | |||
MochiKit.Base.update(MochiKit.Position, { | |||
// set to true if needed, warning: firefox performance problems | |||
// NOT neeeded for page scrolling, only if draggable contained in | |||
// scrollable elements | |||
includeScrollOffsets: false, | |||
/** @id MochiKit.Position.prepare */ | |||
prepare: function () { | |||
var deltaX = window.pageXOffset | |||
|| document.documentElement.scrollLeft | |||
|| document.body.scrollLeft | |||
|| 0; | |||
var deltaY = window.pageYOffset | |||
|| document.documentElement.scrollTop | |||
|| document.body.scrollTop | |||
|| 0; | |||
this.windowOffset = new MochiKit.Style.Coordinates(deltaX, deltaY); | |||
}, | |||
/** @id MochiKit.Position.cumulativeOffset */ | |||
cumulativeOffset: function (element) { | |||
var valueT = 0; | |||
var valueL = 0; | |||
do { | |||
valueT += element.offsetTop || 0; | |||
valueL += element.offsetLeft || 0; | |||
element = element.offsetParent; | |||
} while (element); | |||
return new MochiKit.Style.Coordinates(valueL, valueT); | |||
}, | |||
/** @id MochiKit.Position.realOffset */ | |||
realOffset: function (element) { | |||
var valueT = 0; | |||
var valueL = 0; | |||
do { | |||
valueT += element.scrollTop || 0; | |||
valueL += element.scrollLeft || 0; | |||
element = element.parentNode; | |||
} while (element); | |||
return new MochiKit.Style.Coordinates(valueL, valueT); | |||
}, | |||
/** @id MochiKit.Position.within */ | |||
within: function (element, x, y) { | |||
if (this.includeScrollOffsets) { | |||
return this.withinIncludingScrolloffsets(element, x, y); | |||
} | |||
this.xcomp = x; | |||
this.ycomp = y; | |||
this.offset = this.cumulativeOffset(element); | |||
if (element.style.position == "fixed") { | |||
this.offset.x += this.windowOffset.x; | |||
this.offset.y += this.windowOffset.y; | |||
} | |||
return (y >= this.offset.y && | |||
y < this.offset.y + element.offsetHeight && | |||
x >= this.offset.x && | |||
x < this.offset.x + element.offsetWidth); | |||
}, | |||
/** @id MochiKit.Position.withinIncludingScrolloffsets */ | |||
withinIncludingScrolloffsets: function (element, x, y) { | |||
var offsetcache = this.realOffset(element); | |||
this.xcomp = x + offsetcache.x - this.windowOffset.x; | |||
this.ycomp = y + offsetcache.y - this.windowOffset.y; | |||
this.offset = this.cumulativeOffset(element); | |||
return (this.ycomp >= this.offset.y && | |||
this.ycomp < this.offset.y + element.offsetHeight && | |||
this.xcomp >= this.offset.x && | |||
this.xcomp < this.offset.x + element.offsetWidth); | |||
}, | |||
// within must be called directly before | |||
/** @id MochiKit.Position.overlap */ | |||
overlap: function (mode, element) { | |||
if (!mode) { | |||
return 0; | |||
} | |||
if (mode == 'vertical') { | |||
return ((this.offset.y + element.offsetHeight) - this.ycomp) / | |||
element.offsetHeight; | |||
} | |||
if (mode == 'horizontal') { | |||
return ((this.offset.x + element.offsetWidth) - this.xcomp) / | |||
element.offsetWidth; | |||
} | |||
}, | |||
/** @id MochiKit.Position.absolutize */ | |||
absolutize: function (element) { | |||
element = MochiKit.DOM.getElement(element); | |||
if (element.style.position == 'absolute') { | |||
return; | |||
} | |||
MochiKit.Position.prepare(); | |||
var offsets = MochiKit.Position.positionedOffset(element); | |||
var width = element.clientWidth; | |||
var height = element.clientHeight; | |||
var oldStyle = { | |||
'position': element.style.position, | |||
'left': offsets.x - parseFloat(element.style.left || 0), | |||
'top': offsets.y - parseFloat(element.style.top || 0), | |||
'width': element.style.width, | |||
'height': element.style.height | |||
}; | |||
element.style.position = 'absolute'; | |||
element.style.top = offsets.y + 'px'; | |||
element.style.left = offsets.x + 'px'; | |||
element.style.width = width + 'px'; | |||
element.style.height = height + 'px'; | |||
return oldStyle; | |||
}, | |||
/** @id MochiKit.Position.positionedOffset */ | |||
positionedOffset: function (element) { | |||
var valueT = 0, valueL = 0; | |||
do { | |||
valueT += element.offsetTop || 0; | |||
valueL += element.offsetLeft || 0; | |||
element = element.offsetParent; | |||
if (element) { | |||
p = MochiKit.Style.getStyle(element, 'position'); | |||
if (p == 'relative' || p == 'absolute') { | |||
break; | |||
} | |||
} | |||
} while (element); | |||
return new MochiKit.Style.Coordinates(valueL, valueT); | |||
}, | |||
/** @id MochiKit.Position.relativize */ | |||
relativize: function (element, oldPos) { | |||
element = MochiKit.DOM.getElement(element); | |||
if (element.style.position == 'relative') { | |||
return; | |||
} | |||
MochiKit.Position.prepare(); | |||
var top = parseFloat(element.style.top || 0) - | |||
(oldPos['top'] || 0); | |||
var left = parseFloat(element.style.left || 0) - | |||
(oldPos['left'] || 0); | |||
element.style.position = oldPos['position']; | |||
element.style.top = top + 'px'; | |||
element.style.left = left + 'px'; | |||
element.style.width = oldPos['width']; | |||
element.style.height = oldPos['height']; | |||
}, | |||
/** @id MochiKit.Position.clone */ | |||
clone: function (source, target) { | |||
source = MochiKit.DOM.getElement(source); | |||
target = MochiKit.DOM.getElement(target); | |||
target.style.position = 'absolute'; | |||
var offsets = this.cumulativeOffset(source); | |||
target.style.top = offsets.y + 'px'; | |||
target.style.left = offsets.x + 'px'; | |||
target.style.width = source.offsetWidth + 'px'; | |||
target.style.height = source.offsetHeight + 'px'; | |||
}, | |||
/** @id MochiKit.Position.page */ | |||
page: function (forElement) { | |||
var valueT = 0; | |||
var valueL = 0; | |||
var element = forElement; | |||
do { | |||
valueT += element.offsetTop || 0; | |||
valueL += element.offsetLeft || 0; | |||
// Safari fix | |||
if (element.offsetParent == document.body && MochiKit.Style.getStyle(element, 'position') == 'absolute') { | |||
break; | |||
} | |||
} while (element = element.offsetParent); | |||
element = forElement; | |||
do { | |||
valueT -= element.scrollTop || 0; | |||
valueL -= element.scrollLeft || 0; | |||
} while (element = element.parentNode); | |||
return new MochiKit.Style.Coordinates(valueL, valueT); | |||
} | |||
}); | |||
MochiKit.Position.__new__ = function (win) { | |||
var m = MochiKit.Base; | |||
this.EXPORT_TAGS = { | |||
':common': this.EXPORT, | |||
':all': m.concat(this.EXPORT, this.EXPORT_OK) | |||
}; | |||
m.nameFunctions(this); | |||
}; | |||
MochiKit.Position.__new__(this); |