Make sure that jQuery works even when the individual modules are loaded separately...
[jquery.git] / src / dimensions.js
index 42e3f1d..58c16af 100644 (file)
@@ -1,28 +1,61 @@
+(function( jQuery ) {
+
 // Create innerHeight, innerWidth, outerHeight and outerWidth methods
-jQuery.each([ "Height", "Width" ], function(i, name){
+jQuery.each([ "Height", "Width" ], function( i, name ) {
 
-       var tl = name == "Height" ? "Top"    : "Left",  // top or left
-               br = name == "Height" ? "Bottom" : "Right"; // bottom or right
+       var type = name.toLowerCase();
 
        // 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] ?
+                       jQuery.css( this[0], type, undefined, false, "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] ?
+                       jQuery.css( this[0], type, undefined, false, 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 ]() ) );
+                       });
+               }
+
+               return ("scrollTo" in elem && elem.document) ? // does it walk and quack like a window?
+                       // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
+                       elem.document.compatMode === "CSS1Compat" && elem.document.documentElement[ "client" + name ] ||
+                       elem.document.body[ "client" + name ] :
+
+                       // Get document width or height
+                       (elem.nodeType === 9) ? // is it a document
+                               // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
+                               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
+                               size === undefined ?
+                                       // Get width or height on the element
+                                       jQuery.css( elem, type ) :
+
+                                       // Set the width or height on the element (default to pixels if value is unitless)
+                                       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;
-}
+})( jQuery );