function EventStopPropagation() {
	if (window.event) {
		this.rawEvent.cancelBubble = true;
	}
	else {
		this.rawEvent.stopPropagation();
	}
	return true;
}

function getEventObject(rawEvent) {
	if (typeof(rawEvent)=="undefined") {
		rawEvent = window.event;
	}
	if (rawEvent.adjusted) { return rawEvent; }
	if (!rawEvent) { rawEvent = window.event; }
	var evt = new Object();
	if (rawEvent.pageX) {
		evt.target = (rawEvent.target.tagName ? rawEvent.target : rawEvent.target.parentNode);
		evt.mouseButton = rawEvent.mouseButton;
		evt.relatedTarget = rawEvent.relatedTarget;
		evt.rawEvent = rawEvent;
		evt.stopPropagation = EventStopPropagation;
		evt.left = parseInt(rawEvent.pageX);
		evt.top = parseInt(rawEvent.pageY);
	}
	else {
		evt.srcElement = rawEvent.srcElement;
		evt.target = rawEvent.srcElement;
		evt.mouseButton = rawEvent.button;
		evt.relatedTarget = rawEvent.toElement;
		evt.rawEvent = rawEvent;
		evt.stopPropagation = EventStopPropagation;
		var sl, st;
		if (document.documentElement) {
			sl = document.documentElement.scrollLeft;
			st = document.documentElement.scrollTop;
		}
		else {
			sl = document.body.scrollLeft;
			st = document.body.scrollTop;
		}
		evt.left = sl+rawEvent.clientX;
		evt.top = st+rawEvent.clientY;
	}
	evt.clientX = rawEvent.clientX;
	evt.clientY = rawEvent.clientY;
	evt.ctrlKey = rawEvent.ctrlKey;
	evt.adjusted = true;
	return evt;
}

var geo = getEventObject;

/***
el: either id of element as string, or element itself
name: string name of event, without 'on' prefix
funcName: string name of function
bubble: (bool) whether event bubbles up
*/
function setEventListener(el, eventName, funcName, bubble) {
	if (typeof(el)=="string") {
		el = document.getElementById(el);
	}
	if (el.addEventListener) {
		el.addEventListener(eventName, eval(funcName), bubble);
	}
	else {
		str = "el.on"+eventName+" = function () { evt = getEventObject(event);\n";
		str += funcName+ "(evt);\n";
		if (!bubble) {
			str += "event.cancelBubble = true;\n";
		}
		str += "return "+(!bubble)+";\n";
		str += "}";
		eval(str);
	}
}

function setEventObjectListener(el, eventName, objName, funcName, bubble) {
	var mglName = objName+"__"+funcName;
	eval(mglName +' = function(evt) { \
		'+objName+'.'+funcName+'(evt); \
	}');
	setEventListener(el, eventName, mglName, bubble);
}

