Make sure that undefined is always returned for undefined data properties. Fixes...
[jquery.git] / src / offset.js
index 7ae9cb9..f80574e 100644 (file)
@@ -2,16 +2,16 @@ if ( "getBoundingClientRect" in document.documentElement ) {
        jQuery.fn.offset = function( options ) {
                var elem = this[0];
 
-               if ( !elem || !elem.ownerDocument ) {
-                       return null;
-               }
-
                if ( options ) { 
-                       return this.each(function() {
-                               jQuery.offset.setOffset( this, options );
+                       return this.each(function( i ) {
+                               jQuery.offset.setOffset( this, options, i );
                        });
                }
 
+               if ( !elem || !elem.ownerDocument ) {
+                       return null;
+               }
+
                if ( elem === elem.ownerDocument.body ) {
                        return jQuery.offset.bodyOffset( elem );
                }
@@ -28,16 +28,16 @@ if ( "getBoundingClientRect" in document.documentElement ) {
        jQuery.fn.offset = function( options ) {
                var elem = this[0];
 
-               if ( !elem || !elem.ownerDocument ) {
-                       return null;
-               }
-
                if ( options ) { 
-                       return this.each(function() {
-                               jQuery.offset.setOffset( this, options );
+                       return this.each(function( i ) {
+                               jQuery.offset.setOffset( this, options, i );
                        });
                }
 
+               if ( !elem || !elem.ownerDocument ) {
+                       return null;
+               }
+
                if ( elem === elem.ownerDocument.body ) {
                        return jQuery.offset.bodyOffset( elem );
                }
@@ -121,7 +121,7 @@ jQuery.offset = {
 
                body.removeChild( container );
                body = container = innerDiv = checkDiv = table = td = null;
-               jQuery.offset.initialize = function() {};
+               jQuery.offset.initialize = jQuery.noop;
        },
 
        bodyOffset: function( body ) {
@@ -137,7 +137,7 @@ jQuery.offset = {
                return { top: top, left: left };
        },
        
-       setOffset: function( elem, options ) {
+       setOffset: function( elem, options, i ) {
                // set position first, in-case top/left are set even on static elem
                if ( /static/.test( jQuery.curCSS( elem, "position" ) ) ) {
                        elem.style.position = "relative";
@@ -145,11 +145,16 @@ jQuery.offset = {
                var curElem   = jQuery( elem ),
                        curOffset = curElem.offset(),
                        curTop    = parseInt( jQuery.curCSS( elem, "top",  true ), 10 ) || 0,
-                       curLeft   = parseInt( jQuery.curCSS( elem, "left", true ), 10)  || 0,
-                       props     = {
-                               top:  (options.top  - curOffset.top)  + curTop,
-                               left: (options.left - curOffset.left) + curLeft
-                       };
+                       curLeft   = parseInt( jQuery.curCSS( elem, "left", true ), 10 ) || 0;
+
+               if ( jQuery.isFunction( options ) ) {
+                       options = options.call( elem, i, curOffset );
+               }
+
+               var props = {
+                       top:  (options.top  - curOffset.top)  + curTop,
+                       left: (options.left - curOffset.left) + curLeft
+               };
                
                if ( "using" in options ) {
                        options.using.call( elem, props );