<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -15,6 +15,7 @@ Element.Layout = Class.create({
     }, options || {});
     
     this.layout = {};
+    
     this.getLayout();
   },
   
@@ -84,6 +85,9 @@ Element.Layout = Class.create({
         element.style.marginRight = originalRight;
       }
 
+      // We can't assume the user will want _all_ position values at once;
+      // it'd be too costly. Instead, we load the values on demand.
+
       var paddingBox = {
         width:  noOffsetWidth || element.clientWidth,
         height: element.clientHeight
@@ -152,23 +156,14 @@ Element.Layout = Class.create({
   // &quot;trbl&quot; = top, right, bottom, left
   // &quot;tb&quot;   = top, bottom
   _getStyleValuesFor: function(property, sidesNeeded) {
-    var sides = $w('top bottom left right');
-    var propertyNames = sides.map( function(s) {
-      return property + s.capitalize();
-    });
-    
-    if (property === 'border') {
-      propertyNames = propertyNames.map( function(p) {
-        return p + 'Width';
-      });
-    }
-    
+    var sides = $w('top bottom left right'), propertyName;
     var values = {};
-    
-    sides.each( function(side, index) {
-      if (!sidesNeeded.include(side.charAt(0))) return;
-      values[side] = this.cssToNumber(propertyNames[index]);
-    }, this);
+    for (var i = 0, side; side = sides[i]; i++) {
+      if (!sidesNeeded.include(side.charAt(0))) continue;      
+      propertyName = property + side.capitalize();      
+      if (property === 'border') propertyName += 'Width';      
+      values[side] = this.cssToNumber(propertyName);
+    }
     
     return values;    
   },
@@ -331,8 +326,28 @@ Element.Layout = Class.create({
       element = element.parentNode;
     } while (element);
     return Element.Layout.normalize({ left: valueL, top: valueT });
-  }  
+  },
   
+  /**
+   *  Element.Layout#relativeTo(element) -&gt; Object
+   *  Reports the element's top- and left-distance from the upper-left
+   *  corner of the given element.
+   *
+  **/
+  relativeTo: function(element) {
+    element = $(element);
+    var viewportOffset = this.viewportOffset();
+    if (element === document.viewport) {
+      return viewportOffset;
+    } else {
+      var otherLayout = element.getLayout();      
+      var otherViewportOffset = otherLayout.viewportOffset();      
+      return Element.Layout.normalize({
+        left: viewportOffset.left - otherViewportOffset.left,
+        top:  viewportOffset.top  - otherViewportOffset.top
+      });      
+    }
+  }  
 });
 
 if (Prototype.Browser.IE) {
@@ -384,7 +399,7 @@ Object.extend(Element.Methods, {
    *  when speed is of the utmost importance.
   **/  
   getLayout: function(element, options) {
-    return new Element.Layout(element, options).toObject();
+    return new Element.Layout(element, options);
   },
   
   getDimensions: function(element) {</diff>
      <filename>src/dimensions.js</filename>
    </modified>
    <modified>
      <diff>@@ -16,18 +16,6 @@ div.style-test { margin-left: 1px }
 #floating_style { float: left }
 #op2 { opacity:0.5;filter:alpha(opacity=50)progid:DXImageTransform.Microsoft.Blur(strength=10);}
 
-#scroll_test_1 { 
-  margin: 10px;
-  padding: 10px;
-  position: relative;
-}
-
-#scroll_test_2 {
-  position: absolute;
-  left: 10px;
-  top: 10px;
-}
-
 #dimensions-visible,
 #dimensions-display-none,
 #dimensions-visible-pos-rel,</diff>
      <filename>test/unit/fixtures/dom.css</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>36a7e7852086fb413ea661bfd5c59c1e6652024b</id>
    </parent>
  </parents>
  <author>
    <name>Andrew Dupont</name>
    <email>prototype@andrewdupont.net</email>
  </author>
  <url>http://github.com/savetheclocktower/prototype/commit/ff2a98ce63f4ee8e6ee106cedec0878c80da6ad8</url>
  <id>ff2a98ce63f4ee8e6ee106cedec0878c80da6ad8</id>
  <committed-date>2008-10-05T16:10:50-07:00</committed-date>
  <authored-date>2008-10-05T16:10:50-07:00</authored-date>
  <message>Fixed failing dimensions tests.</message>
  <tree>906636ad1f69968ef6a5740c2688f164b6d9392a</tree>
  <committer>
    <name>Andrew Dupont</name>
    <email>prototype@andrewdupont.net</email>
  </committer>
</commit>
