// ==UserScript==
// @name          Focus First Input
// @description   Focus the first viewable input on a page (ltr, ttb)
// @namespace     http://www.gozer.org/mozilla/greasemonkey/
// @include       *
// ==/UserScript==

function getPosX(e)
{
  var i = 0;

  if(e.offsetParent) {
    while(e.offsetParent) {
      i += e.offsetLeft
      e = e.offsetParent;
    }
  } else if(e.x)
    i += e.x;

  return(i);
}

function getPosY(e) {
  var i = 0;

  if(e.offsetParent) {
    while(e.offsetParent) {
      i += e.offsetTop
      e = e.offsetParent;
    }
  } else if(e.y)
    i += e.y;

  return(i);
}

(function() {
  var vX = window.pageXOffset;
  var vY = window.pageYOffset;
  var vW = vX + window.innerWidth;
  var vH = vY + window.innerHeight;

  var e = document.getElementsByTagName('input');

  var p = { e: null, x: 0, y: 0 };

  for(var i = 0; i < e.length; i++)
    if(e[i].type == 'text') {
        var eX = getPosX(e[i]),  // get overall x/y
            eY = getPosY(e[i]);

        // make sure the element is in the viewable area
        if(eX > vX && eX < vW && eY > vY && eY < vH)
          // unset or saved has lower x/y
          if(!p.e || (eX < p.x && eY < p.y)) {
            p.e = e[i];
            p.x = eX;
            p.y = eY;
          }
      }

  if(p.e)
    p.e.focus();
})();
