
/*
 Mouser.js
   Tell me where the mouse is
*/

function Mouser()
{
}
new Mouser();

Mouser.x = null;
Mouser.y = null;
Mouser.clicked = false;
Mouser.down = false;
Mouser.layers = false;
Mouser.ns6 = false;
Mouser.listener = null;

Mouser.begin = function()
{
  Mouser.layers = (document.layers) ? true : false;
  Mouser.ns6 = document.getElementById && !document.all;
  if(Mouser.layers)
  {
    document.captureEvents(Event.MOUSEMOVE);
    document.onMouseMove = Mouser.moved;
    document.captureEvents(Event.CLICK);
    document.onClick = Mouser.clicked;
    document.captureEvents(Event.MOUSEDOWN);
    document.onMouseDown = Mouser.downed;
    document.captureEvents(Event.MOUSEUP);
    document.onMouseUp = Mouser.upped;
  } 
  else
  {
    document.onmousemove = Mouser.moved;
    document.onmove = Mouser.moved;
    document.onclick = Mouser.clicked;
    document.onmouseup = Mouser.upped;
    document.onmousedown = Mouser.downed;
  }
  Mouser.clicked = false;
}

Mouser.regListener = function(listener)
{
  Mouser.listener = listener;
}

Mouser.listen = function()
{
  if(Mouser.listener != null)
  {
    Mouser.listener();
  }
  Mouser.reset();
}

Mouser.moved = function(e)
{
  Mouser.getXYPos(e);
  Mouser.listen();
}

Mouser.downed = function(e)
{
  Mouser.down = true;
  Mouser.listen();
}

Mouser.upped = function(e)
{
  Mouser.down = false;
  Mouser.listen();
}

Mouser.clicked = function(e)
{
  Mouser.clicked = true;
  Mouser.listen();
}

Mouser.reset = function()
{
  Mouser.clicked = false;
}

Mouser.getXYPos = function(e)
{  
  if(!e)
  {
    e = window.event;
  }
  
  if(!Mouser.isEOK(e))
  {
    Mouser.x = 0;
    Mouser.y = 0;
    return;
  }
  
  if(Mouser.isPageXY(e))
  {
    Mouser.x = parseInt(e.pageX);
    Mouser.y = parseInt(e.pageY);
  }
  else
  {
    if(Mouser.isXY(e))
    {
      Mouser.x = parseInt(e.x);
      Mouser.y = parseInt(e.y);
    }
    else
    {
      Mouser.x = parseInt(e.clientX);
      Mouser.y = parseInt(e.clientY);
    }
    if(!Mouser.isOIK())
    {
      if(Mouser.isScrolledEl())
      {
        Mouser.x += parseInt(document.documentElement.scrollLeft);
        Mouser.y += parseInt(document.documentElement.scrollTop);
      }
      else if(Mouser.isScrolledBod())
      {
        Mouser.x += parseInt(document.body.scrollLeft);
        Mouser.y += parseInt(document.body.scrollTop);
      }
    }
  }
}


Mouser.isEOK = function(e)
{
  var val = 
  (e &&
   ((typeof(e.pageX) == "number") ||
    (typeof(e.clientX) == "number") ||
    (typeof(e.x) == "number"))
  );
  return val;
}

Mouser.isPageXY = function(e)
{
  var val = (typeof(e.pageX) == "number");
  return val;
}

Mouser.isXY = function(e)
{
  var val = (typeof(e.x) == "number");
  return val;
}

Mouser.isOIK = function()
/*
 is Opera, InScript, KDE
*/
{
  var val = 
  (
    (window.navigator.userAgent.indexOf('Opera') + 1 ) 
    || 
    (
      window.ScriptEngine
      &&
      (ScriptEngine().indexOf('InScript') + 1)
    ) 
    ||
    (window.navigator.vendor == 'KDE')
  );
  return val;
}

Mouser.isScrolledEl = function()
{
  var val =
  document.documentElement &&
  (document.documentElement.scrollTop ||
   document.documentElement.scrollLeft);
  return val;
}

Mouser.isScrolledBod = function()
{
  var val =
  document.body &&
  (document.body.scrollTop ||
   document.body.scrollLeft);
  return val;
}
