/* 
	Copyright (c) 2005-2008 Metablocks, Inc, Metablocks, Ltd. and their affiliates. 
	This software is under non-exclusive licensed to the party using it. 
	For more information contact: info@metablocks.com
	The software cannot reused without permission. All Rights Reserved.
	
	Do not remove this copyright notice.
	
	v. 1.0.1
*/

function CEventManager(){
	this.listeners=[];
	this.eventPreviewListeners=[];
	this.browserIsIE = (!navigator.userAgent.match(/opera/gi) && navigator.userAgent.match(/msie/gi));
	this.addListener=function(obj, eventName, func, scope, listenForPassivePropagation){
		scope=scope?scope:obj; 
		var wrapper=function(e){ 
			return (!e.passivePropagation || listenForPassivePropagation)?func.call(scope, e):true;
		};
		this.listeners[this.listeners.length]=[obj, eventName, func, wrapper];
		if(window.addEventListener)	obj.addEventListener(eventName, wrapper, false);
		else	obj.attachEvent('on'+eventName, wrapper);
	}
	this.removeListener=function(obj, eventName, func){
		var res=false;
		var index=-1;
		for(var i=0; i<this.listeners.length; ++i)
			if(this.listeners[i][0]==obj && this.listeners[i][1]==eventName && this.listeners[i][2]==func){
				index=i; 
				break;
			}
		if(index>-1){
			if(window.removeEventListener)	obj.removeEventListener(eventName, this.listeners[i][3], false);
			else	obj.detachEvent('on'+eventName, this.listeners[i][3]);
			delete this.listeners[i][2];
			delete this.listeners[i][3];
			this.listeners.splice(index, 1);
			res=true;
		}
		return res;
	}
	this._onwindowunload=function(e){ 
		for(var i=(this.listeners.length-1); i>=0; --i)
			this.removeListener(this.listeners[i][0], this.listeners[i][1], this.listeners[i][2]);
	}
	this.documentX=function(evt){ 
		return (this.browserIsIE ? evt.clientX + document.documentElement.scrollLeft : evt.pageX);
	}
	this.documentY=function(evt){	
		return (this.browserIsIE ? evt.clientY + document.documentElement.scrollTop : evt.pageY);
	}
	this.stopEvent=function(e, noPassivePropagation){
		if(e.preventDefault)	e.preventDefault();
		else	e.returnValue=false;
	// if e.passivePropagation is set then event hanlers should normally ignore the event
		if(noPassivePropagation){ 
			if(e.stopPropagation)	e.stopPropagation();
			else	e.cancelBubble=true;
		}else
			e.passivePropagation=true;
	}
	
	this.addListener(window, 'unload', this._onwindowunload, this);
}
if(!window.EventManager)	window.EventManager=new CEventManager();
