var rroot = /^(?:body|html)$/i;
jQuery.fn.offset = function (options){
if (arguments.length) {
return options === undefined? this: this.each(function (i){
jQuery.offset.setOffset(this, options, i);
}
);
}
var box, docElem, body, win, clientTop, clientLeft, scrollTop, scrollLeft, top, left, elem = this[0], doc = elem && elem.ownerDocument;
if (!doc) {
return null ;
}
if ((body = doc.body) === elem) {
return jQuery.offset.bodyOffset(elem);
}
docElem = doc.documentElement;
if (!jQuery.contains(docElem, elem)) {
return {
top: 0,
left: 0}
;
}
box = elem.getBoundingClientRect();
win = getWindow(doc);
clientTop = docElem.clientTop || body.clientTop || 0;
clientLeft = docElem.clientLeft || body.clientLeft || 0;
scrollTop = win.pageYOffset || docElem.scrollTop;
scrollLeft = win.pageXOffset || docElem.scrollLeft;
top = box.top + scrollTop - clientTop;
left = box.left + scrollLeft - clientLeft;
return {
top: top,
left: left}
;
}
;
jQuery.offset = {
bodyOffset: function (body){
var top = body.offsetTop, left = body.offsetLeft;
if (jQuery.support.doesNotIncludeMarginInBodyOffset) {
top += parseFloat(jQuery.css(body, "marginTop")) || 0;
left += parseFloat(jQuery.css(body, "marginLeft")) || 0;
}
return {
top: top,
left: left}
;
}
,
setOffset: function (elem, options, i){
var position = jQuery.css(elem, "position");
if (position === "static") {
elem.style.position = "relative";
}
var curElem = jQuery(elem), curOffset = curElem.offset(), curCSSTop = jQuery.css(elem, "top"), curCSSLeft = jQuery.css(elem, "left"), calculatePosition = (position === "absolute" || position === "fixed") && jQuery.inArray("auto", [curCSSTop, curCSSLeft] ) > -1, props = {
}
, curPosition = {
}
, curTop, curLeft;
if (calculatePosition) {
curPosition = curElem.position();
curTop = curPosition.top;
curLeft = curPosition.left;
}
else {
curTop = parseFloat(curCSSTop) || 0;
curLeft = parseFloat(curCSSLeft) || 0;
}
if (jQuery.isFunction(options)) {
options = options.call(elem, i, curOffset);
}
if (options.top != null ) {
props.top = (options.top - curOffset.top) + curTop;
}
if (options.left != null ) {
props.left = (options.left - curOffset.left) + curLeft;
}
if ("using" in options) {
options.using.call(elem, props);
}
else {
curElem.css(props);
}
}
}
;
jQuery.fn.extend({
position: function (){
if (!this[0]) {
return null ;
}
var elem = this[0], offsetParent = this.offsetParent(), offset = this.offset(), parentOffset = rroot.test(offsetParent[0].nodeName)? {
top: 0,
left: 0}
: offsetParent.offset();
offset.top -= parseFloat(jQuery.css(elem, "marginTop")) || 0;
offset.left -= parseFloat(jQuery.css(elem, "marginLeft")) || 0;
parentOffset.top += parseFloat(jQuery.css(offsetParent[0], "borderTopWidth")) || 0;
parentOffset.left += parseFloat(jQuery.css(offsetParent[0], "borderLeftWidth")) || 0;
return {
top: offset.top - parentOffset.top,
left: offset.left - parentOffset.left}
;
}
,
offsetParent: function (){
return this.map(function (){
var offsetParent = this.offsetParent || document.body;
while (offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static")){
offsetParent = offsetParent.offsetParent;
}
return offsetParent;
}
);
}
}
);
jQuery.each({
scrollLeft: "pageXOffset",
scrollTop: "pageYOffset"}
, function (method, prop){
var top = /Y/.test(prop);
jQuery.fn[method] = function (val){
return jQuery.access(this, function (elem, method, val){
var win = getWindow(elem);
if (val === undefined) {
return win? (prop in win)? win[prop]: win.document.documentElement[method]: elem[method];
}
if (win) {
win.scrollTo(!top? val: jQuery(win).scrollLeft(), top? val: jQuery(win).scrollTop());
}
else {
elem[method] = val;
}
}
, method, val, _AN_Read_length("length", arguments), null );
}
;
}
);
function getWindow(elem){
return jQuery.isWindow(elem)? elem: elem.nodeType === 9? elem.defaultView || elem.parentWindow: false ;
}