if (typeof window.NGSControlsNamespace == "undefined")
{
	window.NGSControlsNamespace = {};
}

if (
	typeof(window.NGSControlsNamespace.DomEventMixin) == "undefined" ||
	typeof(window.NGSControlsNamespace.DomEventMixin.Version) == null ||
	window.NGSControlsNamespace.DomEventMixin.Version < 1
	)
{	
	
	NGSControlsNamespace.DomEventMixin = 
	{
		Version : 1, // Change the version when make changes. Change the value in the IF also
		
		Initialize : function(obj)
		{
			obj.CreateEventHandler = this.CreateEventHandler;
			obj.AttachDomEvent = this.AttachDomEvent;
			obj.DetachDomEvent = this.DetachDomEvent;
			obj.DisposeDomEventHandlers = this.DisposeDomEventHandlers;
			obj.DomEventHandlers = [];
			obj.DomEventHandlersHash = {};
			obj._domEventHandlingEnabled = true;
			obj.EnableDomEventHandling = this.EnableDomEventHandling;
			obj.DisableDomEventHandling = this.DisableDomEventHandling;
		},
		
		EnableDomEventHandling : function ()
		{
			this._domEventHandlingEnabled = true;
		},
		
		DisableDomEventHandling : function ()
		{
			this._domEventHandlingEnabled = false;
		},
	
		CreateEventHandler : function (methodName, fireIfDisabled)
		{
			var instance = this;
			return function (e)
			{
				if (!instance._domEventHandlingEnabled && !fireIfDisabled)
				{
					return false;
				}
				
				return instance[methodName](e || window.event);
			}
		},
		
		AttachDomEvent : function(element, eventName, eventHandlerName, fireIfDisabled)
		{
			var eventHandler = this.CreateEventHandler(eventHandlerName, fireIfDisabled);
			
			var eventRegister = { "Element" : element, "Name" : eventName, "Handler" : eventHandler };
		
			this.DomEventHandlers[this.DomEventHandlers.length] = eventRegister;
			this.DomEventHandlersHash[eventHandlerName] = eventHandler;
		
			if (element.addEventListener)
			{
				element.addEventListener(eventName, eventHandler, false);
			}
			else if (element.attachEvent)
			{
				element.attachEvent("on" + eventName, eventHandler);
			}
		},
		
		DetachDomEvent : function(element, eventName, eventHandler)
		{
			if (typeof eventHandler == "string") 
			{
				eventHandler = this.DomEventHandlersHash[eventHandler];
			}
			
			
			if (!element)
			{
			    return;
			}
			if (element.removeEventListener)
			{
				element.removeEventListener(eventName, eventHandler, false);
			}
			else if (element.detachEvent)
			{
				element.detachEvent("on" + eventName, eventHandler);
			}
		},
		
		DisposeDomEventHandlers : function()
		{
			for (var i = 0; i < this.DomEventHandlers.length; i++)
			{
				this.DetachDomEvent(
				this.DomEventHandlers[i].Element, 
				this.DomEventHandlers[i].Name, 
				this.DomEventHandlers[i].Handler);
				this.DomEventHandlers[i].Element = null;
			}
		}	
	}
	
	NGSControlsNamespace.DomEvent = {};
	
	NGSControlsNamespace.DomEvent.PreventDefault = function (e)
	{
		if (!e) return true;
		
		if (e.preventDefault)
		{
			e.preventDefault();
		}
	
		e.returnValue = false;
		return false;
	}
	
	NGSControlsNamespace.DomEvent.StopPropagation = function (e)
	{
		if (!e) return;
		
		if (e.stopPropagation)
		{
			e.stopPropagation();
		}
		else
		{
			e.cancelBubble = true;
		}
	}
	
	NGSControlsNamespace.DomEvent.GetTarget = function (e)
	{
		if (!e) return null;
		
		return e.target || e.srcElement;
	}
	
	
	NGSControlsNamespace.DomEvent.GetRelatedTarget = function (e)
	{
		if (!e) return null;
		
		return e.relatedTarget || (e.type == "mouseout" ? e.toElement : e.fromElement);
	}
	
	NGSControlsNamespace.DomEvent.GetKeyCode = function (e)
	{
		if (!e) return 0;
		
		return e.which || e.keyCode;
	}
}

