docs: function BoxPosition(obj) {
      var isIE8 = (/MSIE\s8\.0/).test(navigator.userAgent);
  
      // Either a BoxPosition was passed in and we need to copy it, or a StyleBox
      // was passed in and we need to copy the results of 'getBoundingClientRect'
      // as the object returned is readonly. All co-ordinate values are in reference
      // to the viewport origin (top left).
      var lh, height, width, top;
      if (obj.div) {
        height = obj.div.offsetHeight;
        width = obj.div.offsetWidth;
        top = obj.div.offsetTop;
  
        var rects = (rects = obj.div.childNodes) && (rects = rects[0]) &&
                    rects.getClientRects && rects.getClientRects();
        obj = obj.div.getBoundingClientRect();
        // In certain cases the outter div will be slightly larger then the sum of
        // the inner div's lines. This could be due to bold text, etc, on some platforms.
        // In this case we should get the average line height and use that. This will
        // result in the desired behaviour.
        lh = rects ? Math.max((rects[0] && rects[0].height) || 0, obj.height / rects.length)
                   : 0;
  
      }
      this.left = obj.left;
      this.right = obj.right;
      this.top = obj.top || top;
      this.height = obj.height || height;
      this.bottom = obj.bottom || (top + (obj.height || height));
      this.width = obj.width || width;
      this.lineHeight = lh !== undefined ? lh : obj.lineHeight;
  
      if (isIE8 && !this.lineHeight) {
        this.lineHeight = 13;
      }
    }