function Browser() {

  var ua, s, i;

  this.isIE    = false;
  this.isNS    = false;
  this.version = null;

  ua = navigator.userAgent;

  s = "MSIE";
  if ((i = ua.indexOf(s)) >= 0) {
    this.isIE = true;
    this.version = parseFloat(ua.substr(i + s.length));
    return;
  }

  s = "Netscape6/";
  if ((i = ua.indexOf(s)) >= 0) {
    this.isNS = true;
    this.version = parseFloat(ua.substr(i + s.length));
    return;
  }

  // Treat any other "Gecko" browser as NS 6.1.

  s = "Gecko";
  if ((i = ua.indexOf(s)) >= 0) {
    this.isNS = true;
    this.version = 6.1;
    return;
  }

// Else we think its ns

 this.isNS = true;
this.version = 6.1;

return;


}

var browser = new Browser();


var EVENT_HOVER=1;
var EVENT_LEFTDOWN=2;
var EVENT_LEFTUP=4;
var DOWN=1;
var UP=0;



function Poller()
{
	this.registry = new Array();
	this.left = UP;
	
	this.registry[EVENT_HOVER] = new Array();
	this.registry[EVENT_LEFTDOWN] = new Array();
	this.registry[EVENT_LEFTUP] = new Array();

	this.x = 0;
	this.y = 0;

	if (browser.isIE) {
		document.attachEvent("onmousemove", movehandler);
		document.attachEvent("onmousedown",  leftdownhandler );
		document.attachEvent("onmouseup",  leftuphandler );
	}
	if (browser.isNS) {
		document.addEventListener("mousemove", movehandler,   false);
		document.addEventListener("mousedown",   leftdownhandler, true);
		document.addEventListener("mouseup",   leftuphandler, true);
	}
}

Poller.prototype.nodefault = function(event)
{
	if (browser.isIE) {
		window.event.cancelBubble = true;
		window.event.returnValue = false;
	}
	if (browser.isNS) {
		event.preventDefault();
	}
}

Poller.prototype.register = function(me, types)
{
	if(types & EVENT_HOVER)
		this.registry[EVENT_HOVER].push(me);
	if(types & EVENT_LEFTDOWN)
		this.registry[EVENT_LEFTDOWN].push(me);
	if(types & EVENT_LEFTUP)
		this.registry[EVENT_LEFTUP].push(me);
}

Poller.prototype.sub = function(event, type)
{
	for(x in this.registry[type])
	{

		this.registry[type][x].handler(event,type);
	}
}

Poller.prototype.fire = function(event1,type)
{
	var event;

	if(browser.isIE) 
	{
		event = window.event;
	}
	else event = event1;

	if(!event.target) event.target = event.srcElement;


	switch(type)
	{
		case EVENT_HOVER:
			
			this.sub(event,type);

		break;
		case EVENT_LEFTDOWN:
			this.left = 1;
			this.sub(event,type);
			
		break;
		case EVENT_LEFTUP:
			this.left = 0;
			this.sub(event,type);

		break;
		

	}

}


function movehandler(event)
{

	var sx,sy;

	if(window.opera)
	{
		sy = document.documentElement.scrollTop;
		sx = document.documentElement.scrollLeft;

		poller.x = (event.clientX+sx);
		poller.y = (event.clientY+sy);
	}
	else
	if(browser.isNS)
	{
		if(window.scrollX) sx = window.scrollX;
		else sx = 0;
		if(window.scrollY) sy = window.scrollY;
		else sy = 0;
		
		poller.x = (event.clientX+2+sx);
		poller.y = (event.clientY+2+sy);

	} 
	else
	{

		poller.x = (event.clientX+document.documentElement.scrollLeft+document.body.scrollLeft);
		poller.y = (event.clientY+document.documentElement.scrollTop+document.body.scrollTop);
	}

			
	if(browser.isIE)
		poller.fire(window.event, EVENT_HOVER);
	else
		poller.fire(event, EVENT_HOVER);

}

function leftdownhandler(event)
{
	if(browser.isIE)
		poller.fire(window.event, EVENT_LEFTDOWN);
	else
		poller.fire(event, EVENT_LEFTDOWN);

}

function leftuphandler(event)
{
	if(browser.isIE)
		poller.fire(window.event, EVENT_LEFTUP);
	else
		poller.fire(event, EVENT_LEFTUP);

}

var poller = new Poller();
