var DOMElemWrapper = new function()
{
	var evtHash = [];
	
	this.getAnInstance = function(_elemId)
	{
		return new function()
		{
			var entity = document.getElementById(_elemId);
				
			this.addEvent = function(_evtName, _fn, _useCapture)
			{
				if (typeof entity.addEventListener != 'undefined')
				{
					entity.addEventListener(_evtName, _fn, _useCapture);
				}
				else if (typeof entity.attachEvent != 'undefined')
				{
					var key = '{_fnKEY::' + entity.uniqueID + ':' + _evtName + ':' + _fn + '}';
					var f = evtHash[key];
					if (typeof f != 'undefined')
						{ return; }
					
					f = function(e)
					{
						e.target = e.srcElement;
						
						if (_evtName == 'mouseover') { e.relatedTarget = e.fromElement; }
						else if (_evtName == 'mouseout') { e.relatedTarget = e.toElement; }
						
						_fn.call(entity, e);
						
						e.target = null;
						e.relatedTarget = null;
					};
					
					evtHash[key] = f;						
					entity.attachEvent('on' + _evtName, f);

					// attach unload event to the window to clean up possible IE memory leaks
					window.attachEvent('onunload', function()
					{
						entity.detachEvent('on' + _evtName, f);
					});
				
					key = null;
					//f = null;   /* DON'T null this out, or we won't be able to detach it */
				}
			};
					
			this.removeEvent = function(_evtName, _fn, _useCapture)
			{
				if (typeof entity.removeEventListener != 'undefined')
				{
					entity.removeEventListener(_evtName, _fn, _useCapture);
				}
				else if (typeof entity.detachEvent != 'undefined')
				{
					var key = '{_fnKEY::' + entity.uniqueID + ':' + _evtName + ':' + _fn + '}';
					var f = evtHash[key];
					if (typeof f != 'undefined')
					{
						entity.detachEvent('on' + _evtName, f);
						delete evtHash[key];
					}
				
					key = null;
					f = null;
				}
			};			
		};
	};
};

var $ = DOMElemWrapper.getAnInstance;
