// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// functions for dealing with layout and geometry of page elements.
// Requires shapes.js

/** returns the bounding box of the given DOM node in document space.
  *
  * @param {Element?} obj a DOM node.
  * @return {Rect?}
  */
function nodeBounds(obj) {
  if (!obj) return null;

  function fixRectForScrolling(r) {
    // Need to take into account scrolling offset of ancestors (IE already does
    // this)
    for (let o = obj.offsetParent;
      o && o.offsetParent;
      o = o.offsetParent) {
      if (o.scrollLeft) {
        r.x -= o.scrollLeft;
      }
      if (o.scrollTop) {
        r.y -= o.scrollTop;
      }
    }
  }

  let refWindow;
  if (obj.ownerDocument && obj.ownerDocument.parentWindow) {
    refWindow = obj.ownerDocument.parentWindow;
  } else if (obj.ownerDocument && obj.ownerDocument.defaultView) {
    refWindow = obj.ownerDocument.defaultView;
  } else {
    refWindow = window;
  }

  // IE, Mozilla 3+
  if (obj.getBoundingClientRect) {
    let rect = obj.getBoundingClientRect();

    return new Rect(rect.left + GetScrollLeft(refWindow),
      rect.top + GetScrollTop(refWindow),
      rect.right - rect.left,
      rect.bottom - rect.top,
      refWindow);
  }

  // Mozilla < 3
  if (obj.ownerDocument && obj.ownerDocument.getBoxObjectFor) {
    let box = obj.ownerDocument.getBoxObjectFor(obj);
    var r = new Rect(box.x, box.y, box.width, box.height, refWindow);
    fixRectForScrolling(r);
    return r;
  }

  // Fallback to recursively computing this
  let left = 0;
  let top = 0;
  for (let o = obj; o.offsetParent; o = o.offsetParent) {
    left += o.offsetLeft;
    top += o.offsetTop;
  }

  var r = new Rect(left, top, obj.offsetWidth, obj.offsetHeight, refWindow);
  fixRectForScrolling(r);
  return r;
}

function GetMousePosition(e) {
  // copied from http://www.quirksmode.org/js/events_compinfo.html
  let posx = 0;
  let posy = 0;
  if (e.pageX || e.pageY) {
    posx = e.pageX;
    posy = e.pageY;
  } else if (e.clientX || e.clientY) {
    let obj = (e.target ? e.target : e.srcElement);
    let refWindow;
    if (obj.ownerDocument && obj.ownerDocument.parentWindow) {
      refWindow = obj.ownerDocument.parentWindow;
    } else {
      refWindow = window;
    }
    posx = e.clientX + GetScrollLeft(refWindow);
    posy = e.clientY + GetScrollTop(refWindow);
  }
  return new Point(posx, posy, window);
}
