[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