/**
 * Returns the named object from the DOM.
 */
function getDOMObject(name) {
  var obj = null;
  if (document.getElementById) { obj = document.getElementById(name); }
  else if (document.all) { obj = document.all[name]; }
  else if (document.layers) { obj = document.layers[name]; }
  return obj;
}

/**
 * Element-relative mouse event coords for Mozilla.
 */
function getOffsets(evt) {
  var target = evt.target;
  if (typeof target.offsetLeft == 'undefined') {
    target = target.parentNode;
  }
  var pageCoords = getPageCoords(target);
  var eventCoords = {
    x: window.pageXOffset + evt.clientX,
    y: window.pageYOffset + evt.clientY
  };
  var offsets = {
    offsetX: eventCoords.x - pageCoords.x,
    offsetY: eventCoords.y - pageCoords.y
  }
  return offsets;
}

function getPageCoords (element) {
  var coords = {x : 0, y : 0};
  while (element) {
    coords.x += element.offsetLeft;
    coords.y += element.offsetTop;
    element = element.offsetParent;
  }
  return coords;
}

/**
 * Vector between two points in world space.
 */
var toDegrees = 360/(Math.PI*2);
var toRadians = (Math.PI*2)/360;
function getVector(lon1, lat1, lon2, lat2) {
  var b = (360 + (toDegrees*(Math.atan2(Math.sin(toRadians*(lon2 - lon1)) * Math.cos(toRadians*(lat2)), Math.cos(toRadians*(lat1)) * Math.sin(toRadians*(lat2)) - Math.sin(toRadians*(lat1)) * Math.cos(toRadians*(lat2)) * Math.cos(toRadians*(lon2-lon1))))))%360;
  return {
  	distance: (60.0 * (toDegrees*Math.acos((Math.sin((toRadians*lat2)) * Math.sin((toRadians*lat1)) + Math.cos((toRadians*lat2)) * Math.cos((toRadians*lat1)) * Math.cos((toRadians*(lon2-lon1)))))) * 1.852),
  	bearing: b<0.5?360+b:b
  };
}