var Handler = {};

if(document.addEventListener){
	Handler.add = function(element, event, handler){
		element.addEventListener(event, handler, false);		
	};
	Handler.remove = function(element, event, handler){
		element.removeEventListener(event, handler, false);
	};
}
else if(document.attachEvent){
	Handler.add = function(element, event, handler){
		if(Handler._find(element, event, handler))
			return;
		var wrappedHandler = function(e){
			if(!e) e = window.event;
			var event = {
				_event: e,
				type: e.type,
				target: e.srcElement, 
				currentTarget: element, 
				relatedTarget: e.fromElement ? e.fromElement : e.toElement,
				eventPhase: (e.srcElement == element) ? 2 : 3, 
				
				clientX: e.clientX, 
				clientY: e.clientY, 
				screenX: e.screenX, 
				screenY: e.screenY,
				
				stopPropagation: function(){ 	this._event.cancelBubble = true; 	},
				preventDefault:  function(){	this._event.returnValue = false;	}
			}
			handler.call(element, event);
		};
		element.attachEvent("on"+event, wrappedHandler);		
				
		var h = {			
			element: 		element,
			event: 			event, 
			handler: 		handler, 
			wrappedHandler: wrappedHandler
		};
		if(!Handler._allHandlers)
			Handler._allHandlers = [];
		Handler._allHandlers.push(h);
		//alert("Added handler width id: "+h.id+" there are "+Handler._allHandlers.length+" handlers registered.");
			
	};
	Handler.remove = function(element, event, handler){		
		var h = Handler._find(element, event, handler);
		if(!h) return;
		element.detachEvent("on"+event, h.wrappedHandler);		
		Handler._allHandlers.splice(h.index, 1);		
		
		//alert("Removed handler width id: "+h.id+" there are "+Handler._allHandlers.length+" handlers registered.");
	};
}
	
Handler._find = function(element_, event_, handler_){
	if(!Handler._allHandlers)
		return null;
	for(var i in Handler._allHandlers){
		if(Handler._allHandlers[i].element == element_ && Handler._allHandlers[i].event == event_ && Handler._allHandlers[i].handler == handler_){
			Handler._allHandlers[i].index = i;
			return Handler._allHandlers[i];
		}
	}
	return null;
}



/* Used for adding level 2 DOM events */
function addUniversalListener(element, event, func, bubble){
	if(element.addEventListener){
		element.addEventListener(event, func, bubble);
	}
	else if(element.attachEvent){
		element.attachEvent("on"+event, func);		
	}
}

function removeUniversalListener(element, event, func, bubble){
	if(element.removeEventListener)
		element.removeEventListener(event, func, bubble);
	else if(element.detachEvent)
		element.detachEvent("on"+event, func);

}




function SuperMouseover(element, over_func, out_func){
	var box_bounds;
 	var isOver = false;
 	
	var box_pos = getPosition(element);
	box_bounds = {
		left: 	box_pos.x,
		right: 	box_pos.x+element.offsetWidth, 
		top: 	box_pos.y,
		bottom: box_pos.y+element.offsetHeight
	};		

 
	
	var mouseMove = function(ev){		
		var mouse = mouseCoords(ev);				
		//fix_log.innerHTML= "top: "+mouse.y+" left: "+mouse.x+" box bouds top: "+box_bounds.top+ " bottom: "+box_bounds.bottom;		
		if(	mouse.x > box_bounds.left && mouse.x < box_bounds.right && mouse.y > box_bounds.top && mouse.y < box_bounds.bottom){	
			if(isOver == true)
				return;				
			isOver = true;
			over_func();			
		}
		else{
			if(isOver == false)
				return;				
			isOver = false;
			out_func();
		}
	}
	Handler.add(document, "mousemove", mouseMove);	
	
	this.enable = function(){
		Handler.add(document, "mousemove", mouseMove);		 		
	}
	
	this.disable = function(){		
		out_func();
		Handler.remove(document, "mousemove", mouseMove);
	}
	
	this.reposition = function(){
		box_pos = getPosition(element);
		box_bounds = {
			left: 	box_pos.x,
			right: 	box_pos.x+element.offsetWidth, 
			top: 	box_pos.y,
			bottom: box_pos.y+element.offsetHeight
		};	
	}
}

