Project

General

Profile

Download (3.48 KB) Statistics
| Branch: | Tag: | Revision:
1
/* Copyright (c) 2007 Paul Bakaus (paul.bakaus@googlemail.com) and Brandon Aaron (brandon.aaron@gmail.com || http://brandonaaron.net)
2
 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
3
 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
4
 *
5
 * $LastChangedDate: 2007-12-20 08:46:55 -0600 (Thu, 20 Dec 2007) $
6
 * $Rev: 4259 $
7
 *
8
 * Version: 1.2
9
 *
10
 * Requires: jQuery 1.2+
11
 */
12

    
13
(function($){
14
	
15
$.dimensions = {
16
	version: '1.2'
17
};
18

    
19
// Create innerHeight, innerWidth, outerHeight and outerWidth methods
20
$.each( [ 'Height', 'Width' ], function(i, name){
21
	
22
	// innerHeight and innerWidth
23
	$.fn[ 'inner' + name ] = function() {
24
		if (!this[0]) return;
25
		
26
		var torl = name == 'Height' ? 'Top'    : 'Left',  // top or left
27
		    borr = name == 'Height' ? 'Bottom' : 'Right'; // bottom or right
28
		
29
		return this.is(':visible') ? this[0]['client' + name] : num( this, name.toLowerCase() ) + num(this, 'padding' + torl) + num(this, 'padding' + borr);
30
	};
31
	
32
	// outerHeight and outerWidth
33
	$.fn[ 'outer' + name ] = function(options) {
34
		if (!this[0]) return;
35
		
36
		var torl = name == 'Height' ? 'Top'    : 'Left',  // top or left
37
		    borr = name == 'Height' ? 'Bottom' : 'Right'; // bottom or right
38
		
39
		options = $.extend({ margin: false }, options || {});
40
		
41
		var val = this.is(':visible') ? 
42
				this[0]['offset' + name] : 
43
				num( this, name.toLowerCase() )
44
					+ num(this, 'border' + torl + 'Width') + num(this, 'border' + borr + 'Width')
45
					+ num(this, 'padding' + torl) + num(this, 'padding' + borr);
46
		
47
		return val + (options.margin ? (num(this, 'margin' + torl) + num(this, 'margin' + borr)) : 0);
48
	};
49
});
50

    
51
// Create scrollLeft and scrollTop methods
52
$.each( ['Left', 'Top'], function(i, name) {
53
	$.fn[ 'scroll' + name ] = function(val) {
54
		if (!this[0]) return;
55
		
56
		return val != undefined ?
57
		
58
			// Set the scroll offset
59
			this.each(function() {
60
				this == window || this == document ?
61
					window.scrollTo( 
62
						name == 'Left' ? val : $(window)[ 'scrollLeft' ](),
63
						name == 'Top'  ? val : $(window)[ 'scrollTop'  ]()
64
					) :
65
					this[ 'scroll' + name ] = val;
66
			}) :
67
			
68
			// Return the scroll offset
69
			this[0] == window || this[0] == document ?
70
				self[ (name == 'Left' ? 'pageXOffset' : 'pageYOffset') ] ||
71
					$.boxModel && document.documentElement[ 'scroll' + name ] ||
72
					document.body[ 'scroll' + name ] :
73
				this[0][ 'scroll' + name ];
74
	};
75
});
76

    
77
$.fn.extend({
78
	position: function() {
79
		var left = 0, top = 0, elem = this[0], offset, parentOffset, offsetParent, results;
80
		
81
		if (elem) {
82
			// Get *real* offsetParent
83
			offsetParent = this.offsetParent();
84
			
85
			// Get correct offsets
86
			offset       = this.offset();
87
			parentOffset = offsetParent.offset();
88
			
89
			// Subtract element margins
90
			offset.top  -= num(elem, 'marginTop');
91
			offset.left -= num(elem, 'marginLeft');
92
			
93
			// Add offsetParent borders
94
			parentOffset.top  += num(offsetParent, 'borderTopWidth');
95
			parentOffset.left += num(offsetParent, 'borderLeftWidth');
96
			
97
			// Subtract the two offsets
98
			results = {
99
				top:  offset.top  - parentOffset.top,
100
				left: offset.left - parentOffset.left
101
			};
102
		}
103
		
104
		return results;
105
	},
106
	
107
	offsetParent: function() {
108
		var offsetParent = this[0].offsetParent;
109
		while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && $.css(offsetParent, 'position') == 'static') )
110
			offsetParent = offsetParent.offsetParent;
111
		return $(offsetParent);
112
	}
113
});
114

    
115
function num(el, prop) {
116
	return parseInt($.curCSS(el.jquery?el[0]:el,prop,true))||0;
117
};
118

    
119
})(jQuery);
(7-7/11)