1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/tests/mochitest/ajax/mochikit/MochiKit/Position.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,258 @@ 1.4 +/*** 1.5 + 1.6 +MochiKit.Position 1.4 1.7 + 1.8 +See <http://mochikit.com/> for documentation, downloads, license, etc. 1.9 + 1.10 +(c) 2005-2006 Bob Ippolito and others. All rights Reserved. 1.11 + 1.12 +***/ 1.13 + 1.14 +if (typeof(dojo) != 'undefined') { 1.15 + dojo.provide('MochiKit.Position'); 1.16 + dojo.require('MochiKit.Base'); 1.17 + dojo.require('MochiKit.DOM'); 1.18 + dojo.require('MochiKit.Style'); 1.19 +} 1.20 +if (typeof(JSAN) != 'undefined') { 1.21 + JSAN.use('MochiKit.Base', []); 1.22 + JSAN.use('MochiKit.DOM', []); 1.23 + JSAN.use('MochiKit.Style', []); 1.24 +} 1.25 + 1.26 +try { 1.27 + if (typeof(MochiKit.Base) == 'undefined' || 1.28 + typeof(MochiKit.Style) == 'undefined' || 1.29 + typeof(MochiKit.DOM) == 'undefined') { 1.30 + throw ''; 1.31 + } 1.32 +} catch (e) { 1.33 + throw 'MochiKit.Style depends on MochiKit.Base, MochiKit.DOM, and MochiKit.Style!'; 1.34 +} 1.35 + 1.36 +if (typeof(MochiKit.Position) == 'undefined') { 1.37 + MochiKit.Position = {}; 1.38 +} 1.39 + 1.40 +MochiKit.Position.NAME = 'MochiKit.Position'; 1.41 +MochiKit.Position.VERSION = '1.4'; 1.42 +MochiKit.Position.__repr__ = function () { 1.43 + return '[' + this.NAME + ' ' + this.VERSION + ']'; 1.44 +}; 1.45 +MochiKit.Position.toString = function () { 1.46 + return this.__repr__(); 1.47 +}; 1.48 + 1.49 +MochiKit.Position.EXPORT_OK = []; 1.50 + 1.51 +MochiKit.Position.EXPORT = [ 1.52 +]; 1.53 + 1.54 + 1.55 +MochiKit.Base.update(MochiKit.Position, { 1.56 + // set to true if needed, warning: firefox performance problems 1.57 + // NOT neeeded for page scrolling, only if draggable contained in 1.58 + // scrollable elements 1.59 + includeScrollOffsets: false, 1.60 + 1.61 + /** @id MochiKit.Position.prepare */ 1.62 + prepare: function () { 1.63 + var deltaX = window.pageXOffset 1.64 + || document.documentElement.scrollLeft 1.65 + || document.body.scrollLeft 1.66 + || 0; 1.67 + var deltaY = window.pageYOffset 1.68 + || document.documentElement.scrollTop 1.69 + || document.body.scrollTop 1.70 + || 0; 1.71 + this.windowOffset = new MochiKit.Style.Coordinates(deltaX, deltaY); 1.72 + }, 1.73 + 1.74 + /** @id MochiKit.Position.cumulativeOffset */ 1.75 + cumulativeOffset: function (element) { 1.76 + var valueT = 0; 1.77 + var valueL = 0; 1.78 + do { 1.79 + valueT += element.offsetTop || 0; 1.80 + valueL += element.offsetLeft || 0; 1.81 + element = element.offsetParent; 1.82 + } while (element); 1.83 + return new MochiKit.Style.Coordinates(valueL, valueT); 1.84 + }, 1.85 + 1.86 + /** @id MochiKit.Position.realOffset */ 1.87 + realOffset: function (element) { 1.88 + var valueT = 0; 1.89 + var valueL = 0; 1.90 + do { 1.91 + valueT += element.scrollTop || 0; 1.92 + valueL += element.scrollLeft || 0; 1.93 + element = element.parentNode; 1.94 + } while (element); 1.95 + return new MochiKit.Style.Coordinates(valueL, valueT); 1.96 + }, 1.97 + 1.98 + /** @id MochiKit.Position.within */ 1.99 + within: function (element, x, y) { 1.100 + if (this.includeScrollOffsets) { 1.101 + return this.withinIncludingScrolloffsets(element, x, y); 1.102 + } 1.103 + this.xcomp = x; 1.104 + this.ycomp = y; 1.105 + this.offset = this.cumulativeOffset(element); 1.106 + if (element.style.position == "fixed") { 1.107 + this.offset.x += this.windowOffset.x; 1.108 + this.offset.y += this.windowOffset.y; 1.109 + } 1.110 + 1.111 + return (y >= this.offset.y && 1.112 + y < this.offset.y + element.offsetHeight && 1.113 + x >= this.offset.x && 1.114 + x < this.offset.x + element.offsetWidth); 1.115 + }, 1.116 + 1.117 + /** @id MochiKit.Position.withinIncludingScrolloffsets */ 1.118 + withinIncludingScrolloffsets: function (element, x, y) { 1.119 + var offsetcache = this.realOffset(element); 1.120 + 1.121 + this.xcomp = x + offsetcache.x - this.windowOffset.x; 1.122 + this.ycomp = y + offsetcache.y - this.windowOffset.y; 1.123 + this.offset = this.cumulativeOffset(element); 1.124 + 1.125 + return (this.ycomp >= this.offset.y && 1.126 + this.ycomp < this.offset.y + element.offsetHeight && 1.127 + this.xcomp >= this.offset.x && 1.128 + this.xcomp < this.offset.x + element.offsetWidth); 1.129 + }, 1.130 + 1.131 + // within must be called directly before 1.132 + /** @id MochiKit.Position.overlap */ 1.133 + overlap: function (mode, element) { 1.134 + if (!mode) { 1.135 + return 0; 1.136 + } 1.137 + if (mode == 'vertical') { 1.138 + return ((this.offset.y + element.offsetHeight) - this.ycomp) / 1.139 + element.offsetHeight; 1.140 + } 1.141 + if (mode == 'horizontal') { 1.142 + return ((this.offset.x + element.offsetWidth) - this.xcomp) / 1.143 + element.offsetWidth; 1.144 + } 1.145 + }, 1.146 + 1.147 + /** @id MochiKit.Position.absolutize */ 1.148 + absolutize: function (element) { 1.149 + element = MochiKit.DOM.getElement(element); 1.150 + if (element.style.position == 'absolute') { 1.151 + return; 1.152 + } 1.153 + MochiKit.Position.prepare(); 1.154 + 1.155 + var offsets = MochiKit.Position.positionedOffset(element); 1.156 + var width = element.clientWidth; 1.157 + var height = element.clientHeight; 1.158 + 1.159 + var oldStyle = { 1.160 + 'position': element.style.position, 1.161 + 'left': offsets.x - parseFloat(element.style.left || 0), 1.162 + 'top': offsets.y - parseFloat(element.style.top || 0), 1.163 + 'width': element.style.width, 1.164 + 'height': element.style.height 1.165 + }; 1.166 + 1.167 + element.style.position = 'absolute'; 1.168 + element.style.top = offsets.y + 'px'; 1.169 + element.style.left = offsets.x + 'px'; 1.170 + element.style.width = width + 'px'; 1.171 + element.style.height = height + 'px'; 1.172 + 1.173 + return oldStyle; 1.174 + }, 1.175 + 1.176 + /** @id MochiKit.Position.positionedOffset */ 1.177 + positionedOffset: function (element) { 1.178 + var valueT = 0, valueL = 0; 1.179 + do { 1.180 + valueT += element.offsetTop || 0; 1.181 + valueL += element.offsetLeft || 0; 1.182 + element = element.offsetParent; 1.183 + if (element) { 1.184 + p = MochiKit.Style.getStyle(element, 'position'); 1.185 + if (p == 'relative' || p == 'absolute') { 1.186 + break; 1.187 + } 1.188 + } 1.189 + } while (element); 1.190 + return new MochiKit.Style.Coordinates(valueL, valueT); 1.191 + }, 1.192 + 1.193 + /** @id MochiKit.Position.relativize */ 1.194 + relativize: function (element, oldPos) { 1.195 + element = MochiKit.DOM.getElement(element); 1.196 + if (element.style.position == 'relative') { 1.197 + return; 1.198 + } 1.199 + MochiKit.Position.prepare(); 1.200 + 1.201 + var top = parseFloat(element.style.top || 0) - 1.202 + (oldPos['top'] || 0); 1.203 + var left = parseFloat(element.style.left || 0) - 1.204 + (oldPos['left'] || 0); 1.205 + 1.206 + element.style.position = oldPos['position']; 1.207 + element.style.top = top + 'px'; 1.208 + element.style.left = left + 'px'; 1.209 + element.style.width = oldPos['width']; 1.210 + element.style.height = oldPos['height']; 1.211 + }, 1.212 + 1.213 + /** @id MochiKit.Position.clone */ 1.214 + clone: function (source, target) { 1.215 + source = MochiKit.DOM.getElement(source); 1.216 + target = MochiKit.DOM.getElement(target); 1.217 + target.style.position = 'absolute'; 1.218 + var offsets = this.cumulativeOffset(source); 1.219 + target.style.top = offsets.y + 'px'; 1.220 + target.style.left = offsets.x + 'px'; 1.221 + target.style.width = source.offsetWidth + 'px'; 1.222 + target.style.height = source.offsetHeight + 'px'; 1.223 + }, 1.224 + 1.225 + /** @id MochiKit.Position.page */ 1.226 + page: function (forElement) { 1.227 + var valueT = 0; 1.228 + var valueL = 0; 1.229 + 1.230 + var element = forElement; 1.231 + do { 1.232 + valueT += element.offsetTop || 0; 1.233 + valueL += element.offsetLeft || 0; 1.234 + 1.235 + // Safari fix 1.236 + if (element.offsetParent == document.body && MochiKit.Style.getStyle(element, 'position') == 'absolute') { 1.237 + break; 1.238 + } 1.239 + } while (element = element.offsetParent); 1.240 + 1.241 + element = forElement; 1.242 + do { 1.243 + valueT -= element.scrollTop || 0; 1.244 + valueL -= element.scrollLeft || 0; 1.245 + } while (element = element.parentNode); 1.246 + 1.247 + return new MochiKit.Style.Coordinates(valueL, valueT); 1.248 + } 1.249 +}); 1.250 + 1.251 +MochiKit.Position.__new__ = function (win) { 1.252 + var m = MochiKit.Base; 1.253 + this.EXPORT_TAGS = { 1.254 + ':common': this.EXPORT, 1.255 + ':all': m.concat(this.EXPORT, this.EXPORT_OK) 1.256 + }; 1.257 + 1.258 + m.nameFunctions(this); 1.259 +}; 1.260 + 1.261 +MochiKit.Position.__new__(this); 1.262 \ No newline at end of file