function addEvent(obj, evType, fn)
{
	var fns = obj["e__" + evType] || [];
	
	if (!obj["e__" + evType]) {
		obj["e__" + evType] = fns;
		
		var raiseEvent = function(e) {
			if (!e && window.event) {
				e = window.event;
			}
			if (!e.target) {
				e.target = e.srcElement;
			}
			for (var f in fns) {
				obj.__fn = fns[f];
				if (obj.__fn)
				{
					obj.__fn(e);
				}
			}
			obj.__fn = null;
		};
		
		if (obj.addEventListener) {
			obj.addEventListener(evType, raiseEvent, false);
		}
		else if (obj.attachEvent) {
			obj.attachEvent("on" + evType, raiseEvent);
		}
		else {
			obj["on" + evType] = raiseEvent;
		}
	}

	for (var f in fns) {
		if (fns[f] == fn) {
			return;
		}
	}
	fns[fns.length] = fn;
}

function removeEvent(obj, evType, fn)
{
	var fns = obj["e__" + evType];
	if (fns) {
		for (var f in fns) {
			if (fns[f] == fn) {
				fns[f] = null;
				return;
			}
		}
	}
}

function cancelEvent(e, c)
{
	e.returnValue = false;
	if (e.preventDefault)
	{
		e.preventDefault();
	}
	if (c)
	{
		e.cancelBubble = true;
		if (e.stopPropagation)
		{
			e.stopPropagation();
		}
	}
}