[richfaces-svn-commits] JBoss Rich Faces SVN: r2240 - trunk/framework/impl/src/main/resources/org/richfaces/renderkit/html/scripts.
richfaces-svn-commits at lists.jboss.org
richfaces-svn-commits at lists.jboss.org
Tue Aug 14 06:30:25 EDT 2007
Author: pyaschenko
Date: 2007-08-14 06:30:24 -0400 (Tue, 14 Aug 2007)
New Revision: 2240
Modified:
trunk/framework/impl/src/main/resources/org/richfaces/renderkit/html/scripts/utils.js
Log:
Richfaces.Position object added
Modified: trunk/framework/impl/src/main/resources/org/richfaces/renderkit/html/scripts/utils.js
===================================================================
--- trunk/framework/impl/src/main/resources/org/richfaces/renderkit/html/scripts/utils.js 2007-08-14 08:52:27 UTC (rev 2239)
+++ trunk/framework/impl/src/main/resources/org/richfaces/renderkit/html/scripts/utils.js 2007-08-14 10:30:24 UTC (rev 2240)
@@ -171,4 +171,164 @@
}
return value;
-};
\ No newline at end of file
+};
+
+if (!Richfaces.position) Richfaces.Position={};
+
+Richfaces.Position.setElementPosition = function(element, baseElement, jointPoint, direction, offset)
+{
+ // parameters:
+ // jointPoint: {x:,y:} or ('top-left','top-right','bottom'-left,'bottom-right')
+ // direction: ('top-left','top-right','bottom'-left,'bottom-right', 'auto')
+ // offset: {x:,y:}
+
+ var elementDim = Richfaces.Position.getOffsetDimensions(element);
+ var baseElementDim = Richfaces.Position.getOffsetDimensions(baseElement);
+
+ var windowRect = Richfaces.Position.getWindowViewport();
+
+ var baseOffset = Position.cumulativeOffset(baseElement);
+
+ // jointPoint
+ var ox=baseOffset[0];
+ var oy=baseOffset[1];
+ var re = /^(top|bottom)-(left|right)$/;
+ var match;
+
+ if (typeof jointPoint=='object') {ox = jointPoint.x; oy = jointPoint.y}
+ else if ( jointPoint && (match=jointPoint.toLowerCase().match(re))!=null )
+ {
+ if (match[2]=='right') ox+=baseElementDim.width;
+ if (match[1]=='bottom') oy+=baseElementDim.height;
+ } else
+ {
+ // ??? auto
+ }
+
+ // direction
+ if (direction && (match=direction.toLowerCase().match(re))!=null )
+ {
+ var d = direction.toLowerCase().split('-');
+ if (match[2]=='left') { ox-=elementDim.width + offset.x; } else ox += offset.x;
+ if (match[1]=='top') { oy-=elementDim.height + offset.y; } else oy += offset.y
+ } else
+ {
+ // auto
+ var theBest = {square:0};
+ // jointPoint: bottom-right, direction: bottom-left
+ var rect = {right: baseOffset[0] + baseElementDim.width, top: baseOffset[1] + baseElementDim.height};
+ rect.left = rect.right - elementDim.width;
+ rect.bottom = rect.top + elementDim.height;
+ ox = rect.left; oy = rect.top;
+ var s = Richfaces.Position.checkCollision(rect, windowRect);
+ if (s!=0)
+ {
+ if (ox>=0 && oy>=0 && theBest.square<s) theBest = {x:ox, y:oy, square:s};
+ // jointPoint: top-right, direction: top-left
+ rect = {right: baseOffset[0] + baseElementDim.width, bottom: baseOffset[1]};
+ rect.left = rect.right - elementDim.width;
+ rect.top = rect.bottom - elementDim.height;
+ ox = rect.left; oy = rect.top;
+ s = Richfaces.Position.checkCollision(rect, windowRect);
+ if (s!=0)
+ {
+ if (ox>=0 && oy>=0 && theBest.square<s) theBest = {x:ox, y:oy, square:s};
+ // jointPoint: bottom-left, direction: bottom-right
+ rect = {left: baseOffset[0], top: baseOffset[1] + baseElementDim.height};
+ rect.right = rect.left + elementDim.width;
+ rect.bottom = rect.top + elementDim.height;
+ ox = rect.left; oy = rect.top;
+ s = Richfaces.Position.checkCollision(rect, windowRect);
+ if (s!=0)
+ {
+ if (ox>=0 && oy>=0 && theBest.square<s) theBest = {x:ox, y:oy, square:s};
+ // jointPoint: top-left, direction: top-right
+ rect = {left: baseOffset[0], bottom: baseOffset[1]};
+ rect.right = rect.left + elementDim.width;
+ rect.top = rect.bottom - elementDim.height;
+ ox = rect.left; oy = rect.top;
+ s = Richfaces.Position.checkCollision(rect, windowRect);
+ if (s!=0)
+ {
+ // the best way selection
+ if (ox<0 || oy<0 || theBest.square>s) {ox=theBest.x; oy=theBest.y}
+ }
+ }
+ }
+
+ }
+ }
+
+ element.style.left = ox + 'px';
+ element.style.top = oy + 'px';
+};
+
+Richfaces.Position.getOffsetDimensions = function(element) {
+ // from prototype 1.5.0 // Pavel Yascenko
+ element = $(element);
+ var display = $(element).getStyle('display');
+ if (display != 'none' && display != null) // Safari bug
+ return {width: element.offsetWidth, height: element.offsetHeight};
+
+ // All *Width and *Height properties give 0 on elements with display none,
+ // so enable the element temporarily
+ var els = element.style;
+ var originalVisibility = els.visibility;
+ var originalPosition = els.position;
+ var originalDisplay = els.display;
+ els.visibility = 'hidden';
+ els.position = 'absolute';
+ els.display = 'block';
+ var originalWidth = element.offsetWidth; // was element.clientWidth // Pavel Yascenko
+ var originalHeight = element.offsetHeight; // was element.clientHeight // Pavel Yascenko
+ els.display = originalDisplay;
+ els.position = originalPosition;
+ els.visibility = originalVisibility;
+ return {width: originalWidth, height: originalHeight};
+};
+
+Richfaces.Position.checkCollision = function(elementRect, windowRect, windowOffset)
+{
+ if (elementRect.left >= windowRect.left &&
+ elementRect.top >= windowRect.top &&
+ elementRect.right <= windowRect.right &&
+ elementRect.bottom <= windowRect.bottom)
+ return 0;
+
+ var rect = {left: (elementRect.left>windowRect.left ? elementRect.left : windowRect.left),
+ top: (elementRect.top>windowRect.top ? elementRect.top : windowRect.top),
+ right: (elementRect.right<windowRect.right ? elementRect.right : windowRect.right),
+ bottom: (elementRect.bottom<windowRect.bottom ? elementRect.bottom : windowRect.bottom)};
+ return (rect.right-rect.left)* (rect.bottom-rect.top);
+};
+
+
+Richfaces.Position.getWindowDimensions = function() {
+ var w = self.innerWidth
+ || document.documentElement.clientWidth
+ || document.body.clientWidth
+ || 0;
+ var h = self.innerHeight
+ || document.documentElement.clientHeight
+ || document.body.clientHeight
+ || 0;
+ return {width:w, height: h};
+};
+
+Richfaces.Position.getWindowScrollOffset = function() {
+ var dx = window.pageXOffset
+ || document.documentElement.scrollLeft
+ || document.body.scrollLeft
+ || 0;
+ var dy = window.pageYOffset
+ || document.documentElement.scrollTop
+ || document.body.scrollTop
+ || 0;
+ return {left:dx, top: dy};
+};
+
+Richfaces.Position.getWindowViewport = function() {
+ var windowDim = Richfaces.Position.getWindowDimensions();
+ var windowOffset = Richfaces.Position.getWindowScrollOffset();
+ return {left:windowOffset.left, top:windowOffset.top, right: windowDim.width+windowOffset.left, bottom: windowDim.height+windowOffset.top};
+};
More information about the richfaces-svn-commits
mailing list