function(elem, ignoreScroll) {
        var rect = elem.getBoundingClientRect();
        var result = {
          top:    rect.top | 0,
          left:   rect.left | 0,
          right:  rect.right | 0,
          bottom: rect.bottom | 0,
          width:  (rect.right - rect.left) | 0,
          height: (rect.bottom - rect.top) | 0
        };

        if (ignoreScroll) { return result; }

        var body = env.doc.body;
        result.top += env.root.pageYOffset || body.scrollTop;
        result.top += env.root.pageXOffset || body.scrollLeft;
        return result;
    }
function(elem, ignoreScroll) {
        var rect = elem.getBoundingClientRect();
        var result = {
          top:    rect.top | 0,
          left:   rect.left | 0,
          right:  rect.right | 0,
          bottom: rect.bottom | 0,
          width:  (rect.right - rect.left) | 0,
          height: (rect.bottom - rect.top) | 0
        };

        if (ignoreScroll) { return result; }

        var body = env.doc.body;
        result.top += env.root.pageYOffset || body.scrollTop;
        result.top += env.root.pageXOffset || body.scrollLeft;
        return result;
    }
function ( elem , ignoreScroll ) { var rect = elem . getBoundingClientRect ( ) ; var result = { top : rect . top | 0 , left : rect . left | 0 , right : rect . right | 0 , bottom : rect . bottom | 0 , width : ( rect . right - rect . left ) | 0 , height : ( rect . bottom - rect . top ) | 0 } ; if ( ignoreScroll ) { return result ; } var body = env . doc . body ; result . top += env . root . pageYOffset || body . scrollTop ; result . top += env . root . pageXOffset || body . scrollLeft ; return result ; }
client rect adjusted to window scroll
client rect adjusted to window scroll