Tagging the 1.5rc1 release.
[jquery.git] / src / dimensions.js
index 4dd1544..e2d411d 100644 (file)
@@ -1,28 +1,67 @@
+(function( jQuery ) {
+
 // Create innerHeight, innerWidth, outerHeight and outerWidth methods
-jQuery.each([ "Height", "Width" ], function(i, name){
+jQuery.each([ "Height", "Width" ], function( i, name ) {
+
+       var type = name.toLowerCase();
 
-       var tl = name == "Height" ? "Top"    : "Left",  // top or left
-               br = name == "Height" ? "Bottom" : "Right"; // bottom or right
-       
        // innerHeight and innerWidth
-       jQuery.fn["inner" + name] = function(){
-               return this[ name.toLowerCase() ]() + 
-                       num(this, "padding" + tl) + 
-                       num(this, "padding" + br);
+       jQuery.fn["inner" + name] = function() {
+               return this[0] ?
+                       parseFloat( jQuery.css( this[0], type, "padding" ) ) :
+                       null;
        };
-       
+
        // outerHeight and outerWidth
-       jQuery.fn["outer" + name] = function(margin) {
-               return this["inner" + name]() + 
-                       num(this, "border" + tl + "Width") +
-                       num(this, "border" + br + "Width") +
-                       (!!margin ? 
-                               num(this, "margin" + tl) + num(this, "margin" + br) : 0);
+       jQuery.fn["outer" + name] = function( margin ) {
+               return this[0] ?
+                       parseFloat( jQuery.css( this[0], type, margin ? "margin" : "border" ) ) :
+                       null;
+       };
+
+       jQuery.fn[ type ] = function( size ) {
+               // Get window width or height
+               var elem = this[0];
+               if ( !elem ) {
+                       return size == null ? null : this;
+               }
+
+               if ( jQuery.isFunction( size ) ) {
+                       return this.each(function( i ) {
+                               var self = jQuery( this );
+                               self[ type ]( size.call( this, i, self[ type ]() ) );
+                       });
+               }
+
+               if ( jQuery.isWindow( elem ) ) {
+                       // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
+                       // 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
+                       var docElemProp = elem.document.documentElement[ "client" + name ];
+                       return elem.document.compatMode === "CSS1Compat" && docElemProp ||
+                               elem.document.body[ "client" + name ] || docElemProp;
+
+               // Get document width or height
+               } else if ( elem.nodeType === 9 ) {
+                       // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
+                       return Math.max(
+                               elem.documentElement["client" + name],
+                               elem.body["scroll" + name], elem.documentElement["scroll" + name],
+                               elem.body["offset" + name], elem.documentElement["offset" + name]
+                       );
+
+               // Get or set width or height on the element
+               } else if ( size === undefined ) {
+                       var orig = jQuery.css( elem, type ),
+                               ret = parseFloat( orig );
+
+                       return jQuery.isNaN( ret ) ? orig : ret;
+
+               // Set the width or height on the element (default to pixels if value is unitless)
+               } else {
+                       return this.css( type, typeof size === "string" ? size : size + "px" );
+               }
        };
-       
+
 });
 
-function num(elem, prop) {
-       elem = elem.jquery ? elem[0] : elem;
-       return elem && parseInt( jQuery.curCSS(elem, prop, true), 10 ) || 0;
-}
\ No newline at end of file
+})( jQuery );