1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/testing/mochitest/MochiKit/New.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,283 @@ 1.4 + 1.5 +MochiKit.Base.update(MochiKit.DOM, { 1.6 + /** @id MochiKit.DOM.makeClipping */ 1.7 + makeClipping: function (element) { 1.8 + element = MochiKit.DOM.getElement(element); 1.9 + var oldOverflow = element.style.overflow; 1.10 + if ((MochiKit.Style.getStyle(element, 'overflow') || 'visible') != 'hidden') { 1.11 + element.style.overflow = 'hidden'; 1.12 + } 1.13 + return oldOverflow; 1.14 + }, 1.15 + 1.16 + /** @id MochiKit.DOM.undoClipping */ 1.17 + undoClipping: function (element, overflow) { 1.18 + element = MochiKit.DOM.getElement(element); 1.19 + if (!overflow) { 1.20 + return; 1.21 + } 1.22 + element.style.overflow = overflow; 1.23 + }, 1.24 + 1.25 + /** @id MochiKit.DOM.makePositioned */ 1.26 + makePositioned: function (element) { 1.27 + element = MochiKit.DOM.getElement(element); 1.28 + var pos = MochiKit.Style.getStyle(element, 'position'); 1.29 + if (pos == 'static' || !pos) { 1.30 + element.style.position = 'relative'; 1.31 + // Opera returns the offset relative to the positioning context, 1.32 + // when an element is position relative but top and left have 1.33 + // not been defined 1.34 + if (/Opera/.test(navigator.userAgent)) { 1.35 + element.style.top = 0; 1.36 + element.style.left = 0; 1.37 + } 1.38 + } 1.39 + }, 1.40 + 1.41 + /** @id MochiKit.DOM.undoPositioned */ 1.42 + undoPositioned: function (element) { 1.43 + element = MochiKit.DOM.getElement(element); 1.44 + if (element.style.position == 'relative') { 1.45 + element.style.position = element.style.top = element.style.left = element.style.bottom = element.style.right = ''; 1.46 + } 1.47 + }, 1.48 + 1.49 + /** @id MochiKit.DOM.getFirstElementByTagAndClassName */ 1.50 + getFirstElementByTagAndClassName: function (tagName, className, 1.51 + /* optional */parent) { 1.52 + var self = MochiKit.DOM; 1.53 + if (typeof(tagName) == 'undefined' || tagName === null) { 1.54 + tagName = '*'; 1.55 + } 1.56 + if (typeof(parent) == 'undefined' || parent === null) { 1.57 + parent = self._document; 1.58 + } 1.59 + parent = self.getElement(parent); 1.60 + var children = (parent.getElementsByTagName(tagName) 1.61 + || self._document.all); 1.62 + if (typeof(className) == 'undefined' || className === null) { 1.63 + return children[0]; 1.64 + } 1.65 + 1.66 + for (var i = 0; i < children.length; i++) { 1.67 + var child = children[i]; 1.68 + var classNames = child.className.split(' '); 1.69 + for (var j = 0; j < classNames.length; j++) { 1.70 + if (classNames[j] == className) { 1.71 + return child; 1.72 + } 1.73 + } 1.74 + } 1.75 + }, 1.76 + 1.77 + /** @id MochiKit.DOM.isParent */ 1.78 + isParent: function (child, element) { 1.79 + if (!child.parentNode || child == element) { 1.80 + return false; 1.81 + } 1.82 + 1.83 + if (child.parentNode == element) { 1.84 + return true; 1.85 + } 1.86 + 1.87 + return MochiKit.DOM.isParent(child.parentNode, element); 1.88 + } 1.89 +}); 1.90 + 1.91 +MochiKit.Position = { 1.92 + // set to true if needed, warning: firefox performance problems 1.93 + // NOT neeeded for page scrolling, only if draggable contained in 1.94 + // scrollable elements 1.95 + includeScrollOffsets: false, 1.96 + 1.97 + /** @id MochiKit.Position.prepare */ 1.98 + prepare: function () { 1.99 + var deltaX = window.pageXOffset 1.100 + || document.documentElement.scrollLeft 1.101 + || document.body.scrollLeft 1.102 + || 0; 1.103 + var deltaY = window.pageYOffset 1.104 + || document.documentElement.scrollTop 1.105 + || document.body.scrollTop 1.106 + || 0; 1.107 + this.windowOffset = new MochiKit.Style.Coordinates(deltaX, deltaY); 1.108 + }, 1.109 + 1.110 + /** @id MochiKit.Position.cumulativeOffset */ 1.111 + cumulativeOffset: function (element) { 1.112 + var valueT = 0; 1.113 + var valueL = 0; 1.114 + do { 1.115 + valueT += element.offsetTop || 0; 1.116 + valueL += element.offsetLeft || 0; 1.117 + element = element.offsetParent; 1.118 + } while (element); 1.119 + return new MochiKit.Style.Coordinates(valueL, valueT); 1.120 + }, 1.121 + 1.122 + /** @id MochiKit.Position.realOffset */ 1.123 + realOffset: function (element) { 1.124 + var valueT = 0; 1.125 + var valueL = 0; 1.126 + do { 1.127 + valueT += element.scrollTop || 0; 1.128 + valueL += element.scrollLeft || 0; 1.129 + element = element.parentNode; 1.130 + } while (element); 1.131 + return new MochiKit.Style.Coordinates(valueL, valueT); 1.132 + }, 1.133 + 1.134 + /** @id MochiKit.Position.within */ 1.135 + within: function (element, x, y) { 1.136 + if (this.includeScrollOffsets) { 1.137 + return this.withinIncludingScrolloffsets(element, x, y); 1.138 + } 1.139 + this.xcomp = x; 1.140 + this.ycomp = y; 1.141 + this.offset = this.cumulativeOffset(element); 1.142 + if (element.style.position == "fixed") { 1.143 + this.offset.x += this.windowOffset.x; 1.144 + this.offset.y += this.windowOffset.y; 1.145 + } 1.146 + 1.147 + return (y >= this.offset.y && 1.148 + y < this.offset.y + element.offsetHeight && 1.149 + x >= this.offset.x && 1.150 + x < this.offset.x + element.offsetWidth); 1.151 + }, 1.152 + 1.153 + /** @id MochiKit.Position.withinIncludingScrolloffsets */ 1.154 + withinIncludingScrolloffsets: function (element, x, y) { 1.155 + var offsetcache = this.realOffset(element); 1.156 + 1.157 + this.xcomp = x + offsetcache.x - this.windowOffset.x; 1.158 + this.ycomp = y + offsetcache.y - this.windowOffset.y; 1.159 + this.offset = this.cumulativeOffset(element); 1.160 + 1.161 + return (this.ycomp >= this.offset.y && 1.162 + this.ycomp < this.offset.y + element.offsetHeight && 1.163 + this.xcomp >= this.offset.x && 1.164 + this.xcomp < this.offset.x + element.offsetWidth); 1.165 + }, 1.166 + 1.167 + // within must be called directly before 1.168 + /** @id MochiKit.Position.overlap */ 1.169 + overlap: function (mode, element) { 1.170 + if (!mode) { 1.171 + return 0; 1.172 + } 1.173 + if (mode == 'vertical') { 1.174 + return ((this.offset.y + element.offsetHeight) - this.ycomp) / 1.175 + element.offsetHeight; 1.176 + } 1.177 + if (mode == 'horizontal') { 1.178 + return ((this.offset.x + element.offsetWidth) - this.xcomp) / 1.179 + element.offsetWidth; 1.180 + } 1.181 + }, 1.182 + 1.183 + /** @id MochiKit.Position.absolutize */ 1.184 + absolutize: function (element) { 1.185 + element = MochiKit.DOM.getElement(element); 1.186 + if (element.style.position == 'absolute') { 1.187 + return; 1.188 + } 1.189 + MochiKit.Position.prepare(); 1.190 + 1.191 + var offsets = MochiKit.Position.positionedOffset(element); 1.192 + var width = element.clientWidth; 1.193 + var height = element.clientHeight; 1.194 + 1.195 + var oldStyle = { 1.196 + 'position': element.style.position, 1.197 + 'left': offsets.x - parseFloat(element.style.left || 0), 1.198 + 'top': offsets.y - parseFloat(element.style.top || 0), 1.199 + 'width': element.style.width, 1.200 + 'height': element.style.height 1.201 + }; 1.202 + 1.203 + element.style.position = 'absolute'; 1.204 + element.style.top = offsets.y + 'px'; 1.205 + element.style.left = offsets.x + 'px'; 1.206 + element.style.width = width + 'px'; 1.207 + element.style.height = height + 'px'; 1.208 + 1.209 + return oldStyle; 1.210 + }, 1.211 + 1.212 + /** @id MochiKit.Position.positionedOffset */ 1.213 + positionedOffset: function (element) { 1.214 + var valueT = 0, valueL = 0; 1.215 + do { 1.216 + valueT += element.offsetTop || 0; 1.217 + valueL += element.offsetLeft || 0; 1.218 + element = element.offsetParent; 1.219 + if (element) { 1.220 + p = MochiKit.Style.getStyle(element, 'position'); 1.221 + if (p == 'relative' || p == 'absolute') { 1.222 + break; 1.223 + } 1.224 + } 1.225 + } while (element); 1.226 + return new MochiKit.Style.Coordinates(valueL, valueT); 1.227 + }, 1.228 + 1.229 + /** @id MochiKit.Position.relativize */ 1.230 + relativize: function (element, oldPos) { 1.231 + element = MochiKit.DOM.getElement(element); 1.232 + if (element.style.position == 'relative') { 1.233 + return; 1.234 + } 1.235 + MochiKit.Position.prepare(); 1.236 + 1.237 + var top = parseFloat(element.style.top || 0) - 1.238 + (oldPos['top'] || 0); 1.239 + var left = parseFloat(element.style.left || 0) - 1.240 + (oldPos['left'] || 0); 1.241 + 1.242 + element.style.position = oldPos['position']; 1.243 + element.style.top = top + 'px'; 1.244 + element.style.left = left + 'px'; 1.245 + element.style.width = oldPos['width']; 1.246 + element.style.height = oldPos['height']; 1.247 + }, 1.248 + 1.249 + /** @id MochiKit.Position.clone */ 1.250 + clone: function (source, target) { 1.251 + source = MochiKit.DOM.getElement(source); 1.252 + target = MochiKit.DOM.getElement(target); 1.253 + target.style.position = 'absolute'; 1.254 + var offsets = this.cumulativeOffset(source); 1.255 + target.style.top = offsets.y + 'px'; 1.256 + target.style.left = offsets.x + 'px'; 1.257 + target.style.width = source.offsetWidth + 'px'; 1.258 + target.style.height = source.offsetHeight + 'px'; 1.259 + }, 1.260 + 1.261 + /** @id MochiKit.Position.page */ 1.262 + page: function (forElement) { 1.263 + var valueT = 0; 1.264 + var valueL = 0; 1.265 + 1.266 + var element = forElement; 1.267 + do { 1.268 + valueT += element.offsetTop || 0; 1.269 + valueL += element.offsetLeft || 0; 1.270 + 1.271 + // Safari fix 1.272 + if (element.offsetParent == document.body && MochiKit.Style.getStyle(element, 'position') == 'absolute') { 1.273 + break; 1.274 + } 1.275 + } while (element = element.offsetParent); 1.276 + 1.277 + element = forElement; 1.278 + do { 1.279 + valueT -= element.scrollTop || 0; 1.280 + valueL -= element.scrollLeft || 0; 1.281 + } while (element = element.parentNode); 1.282 + 1.283 + return new MochiKit.Style.Coordinates(valueL, valueT); 1.284 + } 1.285 +}; 1.286 +